N3OW_Western_eastern_europe/common/character_interactions/00_diarch_interactions.txt

9905 lines
267 KiB
Text

@ai_skill_diff_upper_threshold = 8
@ai_skill_diff_lower_threshold = 2
@ai_prestige_bank_threshold = 2
@ai_core_loop_base_value = 4000
@ai_threshold_for_revoke_cyle = 3
@ai_secondary_powers_base_value = 500
###############################################
# #Setup & Misc
#
# CORE DIARCH POWERS
# diarch_revoke_title_interaction - diarch (actor) takes a title from a vassal of their liege (recipient) with an optional veto for the liege (third_party).
# diarch_retract_vassal_interaction - diarch (actor) takes a vassal from a vassal of their liege (recipient) with an optional veto for the liege (third_party).
# diarch_imprison_interaction - diarch (actor) tries to move a character (recipient) within the sub-realm of their liege (third) to their dungeon, with an optional veto for the liege.
# diarch_entrench_regency_interaction - diarch (actor) shifts the diarchy from temporary to entrenched, making it more difficult for their liege (recipient) to get rid of them.
#
# ANCILLARY DIARCH POWERS
# diarch_legal_meddling_interaction - diarch (actor) either tests learning or spends prestige to gain an unpressed claim on a title held by a vassal of their liege (recipient).
# diarch_syphon_treasury_interaction - diarch (actor) either tests stewardship or spends prestige to gain gold at the expense of negative modifiers delivered to the liege (recipient).
# diarch_shift_privileges_interaction - diarch (actor) either tests diplomacy or spends prestige to give negative modifiers to the lands of a vassal of their liege (secondary recipient), who can't resist.
##################################################
##################################################
# CORE DIARCH POWERS
# Diarch (actor) takes a title from a vassal (recipient) of their liege with an optional veto for the liege (third_party).
diarch_revoke_title_interaction = {
category = interaction_category_diarch
common_interaction = no
interface_priority = 35
diarch_interaction = yes
highlighted_reason = HIGHLIGHTED_CAN_DIARCH_REVOKE
notification_text = DIARCH_REVOKE_TITLE_PROPOSAL
intermediary_notification_text = diarch_interaction_requesting_sign_off.tt
intermediary_breakdown_yes = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_YES
intermediary_breakdown_no = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_NO
intermediary_breakdown_maybe = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_MAYBE
intermediary_answer_accept_key = REPLY_ANSWER_ALLOW
intermediary_answer_reject_key = REPLY_ANSWER_VETO
pre_answer_yes_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_YES
pre_answer_no_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_NO
pre_answer_maybe_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_MAYBE
icon = revoke_title
redirect = {
scope:actor.liege ?= { save_scope_as = intermediary }
}
desc = diarch_revoke_title_interaction_desc
send_name = diarch_revoke_title_interaction.send_name
special_interaction = diarch_revoke_title
interface = revoke_title
target_type = title
target_filter = recipient_domain_titles
ai_maybe = yes
ai_intermediary_maybe = yes
can_send_despite_rejection = yes
popup_on_receive = yes
pause_on_receive = yes
interface_priority = 60
ai_min_reply_days = 4
ai_max_reply_days = 9
on_decline_summary = diarch_rebel_or_crime_summary
prompt = RETRACT_VASSAL_SELECT_VASSAL_TO_RETRACT
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
}
# Make sure scope:recipient is suitable.
scope:recipient = {
# We only target vassals of the liege...
liege = scope:actor.liege
NOT = { this = scope:actor.liege }
# ... who are appropriately landed.
is_landed_or_landless_administrative = yes
scope:recipient.highest_held_title_tier >= tier_county
}
}
is_valid = {
# Here to correct for some dodgy inheritance situations.
NOT = { scope:actor = scope:intermediary }
}
is_valid_showing_failures_only = {
# Standard validity checks.
title_revocation_standard_valid_showing_failures_only_trigger = yes
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Plus make sure there's a legal right to revoke.
scope:actor.liege = {
trigger_if = {
limit = { government_has_flag = government_is_tribal }
custom_description = {
text = "liege_has_law_allowing_title_revocation_tribal"
has_realm_law_flag = title_revocation_allowed
}
}
trigger_else_if = {
limit = { government_has_flag = government_is_administrative }
custom_description = {
text = "cannot_diarch_revoke_administrative_titles"
always = no
}
}
trigger_else = {
custom_description = {
text = "liege_has_law_allowing_title_revocation_crown"
has_realm_law_flag = title_revocation_allowed
}
}
}
trigger_if = {
limit = {
scope:recipient = { vassal_contract_has_flag = vassal_contract_cannot_revoke_titles }
}
custom_description = {
text = liege_vassal_contract_forbids_revocation
object = scope:recipient
scope:recipient = {
NOT = { vassal_contract_has_flag = vassal_contract_cannot_revoke_titles }
}
}
}
# Diarch revocations require a claim.
diarch_revocation_has_claim_check_trigger = yes
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_an_entrenched_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege ?= { has_diarchy_active_parameter = unlock_diarch_revoke_title_interaction }
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
cooldown = { years = 1 }
cooldown_against_recipient = { years = 3 }
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
is_highlighted = {
# Diarch revocations require a claim - this is uncommon, so we always highlight it.
diarch_revocation_has_claim_check_trigger = yes
}
can_be_picked_title = {
scope:target = {
title_revocation_standard_can_pick_title_trigger = yes
# Plus, must have scope:actor as a claimant.
custom_description = {
text = "you_must_have_a_claim_on_the_title"
scope:actor = { has_claim_on = scope:target }
}
}
}
# Hooks can be used to force this through.
## We don't force-force this on/for the player (so no pain but less benefits), but AI regard weak hooks as compulsory from/for other AI.
send_options_exclusive = no
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"
on_send = {
scope:actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
}
# Did a landless diarch send this?
log_diarch_send_interaction_as_variable_effect = { INTERACTION = revoke }
}
on_auto_accept = {
scope:recipient = { trigger_event = char_interaction.0261 }
}
on_accept = {
# Since this is a confusing interaction, we want to clarify what you're nicking.
scope:actor = { custom_tooltip = diarch_revoke_title_interaction.tt.gain_title }
# To keep some other arcane script working.
save_scope_value_as = {
name = revoke_title_interaction
value = yes
}
scope:actor = {
# Tell them that the revocation went through fine.
trigger_event = char_interaction.0262
}
# Otherwise, follow the standard flow for revocation.
save_scope_value_as = {
name = use_strife_not_tyranny
value = yes
}
revoke_title_interaction_effect = yes
scope:actor = {
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# To avoid unlanded regents becoming vassals of the liege's direct vassals, make sure the current liege remains the liege
hidden_effect = {
scope:actor = {
if = {
limit = {
is_landed_or_landless_administrative = no
NOT = { scope:intermediary = scope:recipient }
}
# This has a delay of 1 day (if no delay then the liege change doesn't stick) which really isn't ideal and should be looked into/fixed so that it happens when the action goes into effect
trigger_event = { id = diarchy.0141 days = 1 }
}
}
}
# Debug logging.
debug_log = debug_log.diarch_revoke_title.accepted
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_revoke_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_accept_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_accept_intermediary_list }
}
}
on_intermediary_decline = {
# Scope:intermediary eats a prestige cost for their veto.
scope:intermediary = { add_prestige = liege_diarchy_veto_prestige_cost_high }
scope:actor = {
# Inform scope:actor that their liege has vetoed them.
## First, we log which interaction this is for the event's effects.
save_scope_value_as = {
name = diarch_interaction
value = flag:title_revoke
}
## Then, fire the event.
trigger_event = char_interaction.0291
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Inform scope:recipient that scope:intermediary has their back.
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_good
title = diarch_action_vetoed.tt
left_icon = scope:actor
right_icon = scope:intermediary
custom_tooltip = diarch_revoke_title_interaction.tt.inform_recipient
}
}
# Flick out some opinions.
diarch_revoke_title_interaction_intermediary_fail_opinions_effect = yes
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_revoke_veto }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_veto_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_veto_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_veto_intermediary_list }
}
}
on_decline = {
scope:actor = {
# Tell them that the revocation ran into issues.
trigger_event = char_interaction.0263
# And give a crime reason for both them and the liege.
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = char_interaction.0263.result.criminal
diarch_declare_recipient_criminal_effect = yes
}
50 = {
show_chance = no
desc = char_interaction.0263.result.war
diarch_declare_claim_war_effect = yes
}
}
}
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Flick out some opinions.
## Scope:recipient is annoyed with scope:actor.
scope:recipient = {
add_opinion = {
target = scope:actor
modifier = revoked_title
}
}
# Debug logging.
debug_log = debug_log.diarch_revoke_title.rejected
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_revoke_reject }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_reject_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_reject_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_revoke_reject_intermediary_list }
}
}
auto_accept = {
scope:recipient = {
calc_true_if = {
amount >= 2
custom_description = {
text = "prisoner_revocation"
is_imprisoned_by = scope:actor
}
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
OR = {
# Strong hooks generally.
scope:actor = { has_strong_hook = scope:recipient }
# Weak hooks in inter-AI interactions count as strong hooks.
AND = {
scope:actor = { is_ai = yes }
scope:recipient = { is_ai = yes }
}
}
}
custom_description = {
text = "foreign_prison_revocation"
subject = scope:actor
object = scope:recipient
scope:recipient = {
is_imprisoned = yes
NOT = { is_imprisoned_by = scope:actor }
}
}
}
}
}
ai_intermediary_accept = {
# The AI should be inclined to trust their regent, at least a little.
base = 0
modifier = { add = liege_trust_diarch_trilateral_interaction_default_value }
# Standard modifiers.
intermediary_liege_will_accept_standard_modifiers = {
CURRENCY = prestige
COST = liege_diarchy_veto_prestige_cost_high
}
# Misc important reasons.
## Revoking own capital.
modifier = {
add = 50
desc = AI_TITLE_IS_REALM_CAPITAL
exists = scope:actor.primary_title.title_capital_county
OR = {
scope:landed_title = scope:actor.primary_title.title_capital_county
scope:landed_title = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
}
ai_accept = {
# Try to make it 0 for most interactions
base = 0
# Weak Hook
modifier = {
add = 40
desc = SCHEME_WEAK_HOOK_USED
scope:hook = yes
}
# Opinion Factor
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.8
desc = AI_OPINION_REASON
}
# Refusal is Treason
## It's always treason, but worth pointing it out.
modifier = {
add = 20
desc = AI_REFUSAL_IS_TREASON
}
# Revoking own capital.
modifier = {
add = 50
desc = AI_TITLE_IS_REALM_CAPITAL
exists = scope:actor.primary_title.title_capital_county
OR = {
scope:landed_title = scope:actor.primary_title.title_capital_county
scope:landed_title = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
# We don't buff claimants because you *have* to be a claimant for a diarch revoke.
## Compensated for by refusal _always_ being treason.
# I am a King!
modifier = {
add = -20
desc = offer_vassalization_interaction_aibehavior_amkingtier_tt
scope:recipient = { highest_held_title_tier = tier_kingdom }
}
# Title is part of vassal's primary title de-jure.
modifier = {
add = -25
desc = AI_REFUSAL_IS_DE_JURE_UNDER
OR = {
scope:recipient.primary_title = { is_de_jure_liege_or_above_target = scope:landed_title }
scope:recipient.primary_title = scope:landed_title
}
}
# Dread
## Intimidation
modifier = {
add = intimidated_halved_reason_value
desc = INTIMIDATED_REASON
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 1
}
}
}
## Cowing
modifier = {
add = cowed_halved_reason_value
desc = COWED_REASON
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 2
}
}
}
# Comparative military strength.
modifier = {
add = {
value = 1
subtract = {
value = scope:recipient.max_military_strength
divide = { value = scope:actor.max_military_strength min = 1 }
}
multiply = 50
max = 20
}
desc = offer_vassalization_interaction_aibehavior_power_tt
scope:actor = { is_landed_or_landless_administrative = yes }
}
# Legalistic tradition
modifier = {
add = legalistic_vassal_punishment_acceptance
desc = tradition_legalistic_name
scope:actor = {
has_revoke_title_reason = scope:recipient
culture = { has_cultural_parameter = vassals_more_likely_accept_punishments }
}
}
# Factor for personality.
ai_value_modifier = {
who = scope:recipient
# Greed is always a factor.
ai_greed = {
if = {
limit = {
scope:recipient = {
NOT = { ai_greed = 0 }
}
}
value = -0.75
}
}
# If AI is honourable and the law compels them to obey the liege, AI will be more likely to obey.
ai_honor = {
if = {
limit = {
scope:recipient = { ai_honor > 0 }
}
value = 0.5
}
}
}
# Bump up landless diarchs if we could survive the transition.
modifier = {
add = 100
scope:actor = { is_ruler = no }
scope:recipient = {
any_held_county = { count >= 2 }
}
}
}
# AI
ai_targets = { ai_recipients = peer_vassals }
ai_frequency = 6
ai_potential = {
is_diarch = yes
liege = { has_realm_law_flag = title_revocation_allowed }
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_core_loop_base_value
# Additions.
## Opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = 0.25
}
## Personality.
ai_value_modifier = {
ai_boldness = 0.75
ai_honor = -0.5
}
## Traits.
### +++ Ambitious.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = ambitious
}
### +++ Greedy.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = greedy
}
### +++ Vengeful (under certain criteria).
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = vengeful
has_opinion_modifier = {
modifier = revoked_title
target = scope:recipient
}
}
### ++ Arbitrary.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = arbitrary
}
### - Generous.
modifier = {
add = diarch_ai_desire_minus_1_value
has_trait = generous
}
### -- Just.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = just
}
### --- Content.
modifier = {
add = diarch_ai_desire_minus_3_value
has_trait = content
}
## Landless characters want land, but also want to focus on taking from those who might give it up.
### So we prioritise hooked AI counts.
modifier = {
add = 100
is_landed = no
has_hook = scope:recipient
scope:recipient = {
highest_held_title_tier = tier_county
is_ai = yes
}
}
### Then just hooked AI.
modifier = {
add = 50
is_landed = no
has_hook = scope:recipient
scope:recipient = { is_ai = yes }
}
## Always revoke preferred capital and capital duchy.
modifier = {
add = 1000
exists = scope:actor.primary_title.title_capital_county
OR = {
scope:landed_title = scope:actor.primary_title.title_capital_county
scope:landed_title = scope:actor.primary_title.title_capital_county.de_jure_liege
}
}
## Slight preference for higher-tier titles.
modifier = {
add = {
value = scope:landed_title.tier
multiply = 10
}
}
## We avoid wars here too, but only in the resulting event.
# Factors.
## Relationships.
### + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### - Try not to pick on allies of our liege.
modifier = {
factor = 0.25
should_avoid_hostile_action_against_due_to_liege_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on players unless they're of at least a decent size.
modifier = {
factor = 0
scope:recipient = {
is_ai = no
any_held_county = { count <= 3 }
}
}
### x0 Don't go into prestige debt!
modifier = {
factor = 0
prestige <= 0
}
}
}
# Diarch (actor) takes a vassal from a vassal (recipient) of their liege with an optional veto for the liege (third_party).
diarch_retract_vassal_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
interface_priority = 10
highlighted_reason = HIGHLIGHTED_CAN_DIARCH_RETRACT
notification_text = RETRACT_VASSAL_PROPOSAL
intermediary_notification_text = diarch_interaction_requesting_sign_off.tt
intermediary_breakdown_yes = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_YES
intermediary_breakdown_no = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_NO
intermediary_breakdown_maybe = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_MAYBE
intermediary_answer_accept_key = REPLY_ANSWER_ALLOW
intermediary_answer_reject_key = REPLY_ANSWER_VETO
pre_answer_yes_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_YES
pre_answer_no_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_NO
pre_answer_maybe_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_MAYBE
icon = icon_liege
redirect = {
scope:actor.liege ?= { save_scope_as = intermediary }
}
desc = diarch_retract_vassal_interaction_desc
send_name = diarch_retract_vassal_interaction.send_name
special_interaction = retract_vassal_interaction
interface = transfer_vassal
ai_maybe = yes
ai_intermediary_maybe = yes
can_send_despite_rejection = yes
popup_on_receive = yes
pause_on_receive = yes
interface_priority = 55
ai_min_reply_days = 4
ai_max_reply_days = 9
on_decline_summary = diarch_rebel_or_crime_summary.retract
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
# Plus you need to be landed for this.
is_landed_or_landless_administrative = yes
}
# Make sure scope:recipient is suitable.
scope:recipient = {
# We only target vassals of the liege...
liege = scope:actor.liege
NOT = { this = scope:actor.liege }
# ... who are appropriately landed.
is_landed_or_landless_administrative = yes
scope:recipient.highest_held_title_tier >= tier_duchy
}
}
is_valid = {
# Here to correct for some dodgy inheritance situations.
NOT = { scope:actor = scope:intermediary }
}
is_valid_showing_failures_only = {
# Standard validity checks.
vassal_retraction_standard_valid_showing_failures_only_trigger = yes
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Scope:recipient must hold at least one of scope:actor's de jure vassals.
scope:actor = {
custom_description = {
text = "you_must_have_a_de_jure_vassal_to_retract"
object = scope:recipient
any_held_title = {
tier >= tier_duchy
any_direct_de_jure_vassal_title = {
exists = holder
holder.liege = scope:recipient
}
}
}
}
# Plus make sure there's a legal right to retract.
scope:actor.liege = {
trigger_if = {
limit = { government_has_flag = government_is_tribal }
custom_description = {
text = "liege_has_law_allowing_vassal_retraction_tribal"
has_realm_law_flag = vassal_retraction_allowed
}
}
trigger_if = {
limit = {
NOT = { government_has_flag = government_is_tribal }
}
custom_description = {
text = "liege_has_law_allowing_vassal_retraction_crown"
has_realm_law_flag = vassal_retraction_allowed
}
}
}
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_an_entrenched_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_diarch_retract_vassal_interaction }
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
cooldown = { years = 1 }
cooldown_against_recipient = { years = 3 }
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
is_highlighted = {
# Diarch retractions require a de jure claim - this is uncommon, so we always highlight it.
diarch_retraction_is_de_jure_liege_trigger = yes
}
populate_recipient_list = {
scope:actor = {
every_held_title = {
limit = { tier >= tier_duchy }
every_direct_de_jure_vassal_title = {
limit = { exists = holder }
holder = {
if = {
limit = { liege = scope:recipient }
add_to_list = characters
}
}
}
}
}
}
# Hooks can be used to force this through.
## We don't force-force this on/for the player (so no pain but less benefits), but AI regard weak hooks as compulsory from/for other AI.
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
on_send = {
scope:actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
}
}
on_auto_accept = {
scope:recipient = { trigger_event = char_interaction.0271 }
}
on_accept = {
# Follow the standard flow for retraction.
save_scope_value_as = {
name = use_strife_not_tyranny
value = yes
}
retract_vassal_interaction_effect = yes
scope:actor = {
# Tell them that the retraction went through fine.
trigger_event = char_interaction.0272
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Debug logging.
debug_log = debug_log.diarch_retract_vassal.accepted
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_retract_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_accept_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_accept_intermediary_list }
}
}
on_intermediary_decline = {
# Scope:intermediary eats a prestige cost for their veto.
scope:intermediary = { add_prestige = liege_diarchy_veto_prestige_cost_high }
scope:actor = {
# Inform scope:actor that their liege has vetoed them.
## First, we log which interaction this is for the event's effects.
save_scope_value_as = {
name = diarch_interaction
value = flag:vassal_retract
}
## Then, fire the event.
trigger_event = char_interaction.0291
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Inform scope:recipient that scope:intermediary has their back.
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_good
title = diarch_action_vetoed.tt
left_icon = scope:actor
right_icon = scope:intermediary
custom_tooltip = diarch_retract_vassal_interaction.tt.inform_recipient
}
}
# Flick out some opinions.
diarch_retract_vassal_interaction_intermediary_fail_opinions_effect = yes
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_retract_veto }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_veto_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_veto_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_veto_intermediary_list }
}
}
on_decline = {
scope:actor = {
# Tell them that the retraction ran into issues.
trigger_event = char_interaction.0273
# And give a crime reason for both them and their liege.
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = char_interaction.0273.result.criminal
diarch_declare_recipient_criminal_effect = yes
}
50 = {
show_chance = no
desc = char_interaction.0273.result.war
diarch_declare_vassalisation_war_effect = yes
}
}
}
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Flick out some opinions.
## Scope:recipient is annoyed with scope:actor.
scope:recipient = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
# Debug logging.
debug_log = debug_log.diarch_retract_vassal.rejected
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_retract_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_decline_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_retract_decline_intermediary_list }
}
}
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 }
}
}
}
ai_intermediary_accept = {
# The AI should be inclined to trust their regent, at least a little.
base = 0
modifier = { add = liege_trust_diarch_trilateral_interaction_default_value }
# Standard modifiers.
intermediary_liege_will_accept_standard_modifiers = {
CURRENCY = prestige
COST = liege_diarchy_veto_prestige_cost_high
}
# Misc important reasons.
## Retracting vassal with own capital.
modifier = {
add = 50
desc = AI_VASSAL_HOLDS_REALM_CAPITAL
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
}
}
}
}
}
ai_accept = {
base = 0 # Try to make it 0 for most interactions
# Hook used
modifier = {
add = 40
desc = SCHEME_WEAK_HOOK_USED
scope:hook = yes
}
# Opinion Factor
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 1.0
desc = AI_OPINION_REASON
}
#
modifier = {
add = 25
desc = AI_REFUSAL_IS_TREASON
scope:actor = { has_realm_law_flag = vassal_refusal_is_treason }
}
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 = {
add = 50
desc = AI_VASSAL_HOLDS_REALM_CAPITAL
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
}
}
}
}
modifier = { #Sub-Vassal is NOT De jure of current Vassal.
add = 25
desc = AI_REFUSAL_IS_NOT_DE_JURE_LIEGE
NOT = {
scope:recipient = {
any_held_title = {
is_de_jure_liege_or_above_target = scope:secondary_recipient.primary_title
}
}
}
}
modifier = { #Sub-Vassal is De jure of liege title.
add = 15
desc = AI_REFUSAL_IS_DE_JURE_LIEGE
scope:actor = {
any_held_title = {
this = scope:secondary_recipient.primary_title.de_jure_liege
}
}
}
modifier = {
add = intimidated_halved_reason_value
desc = INTIMIDATED_REASON
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 1
}
}
}
modifier = {
add = cowed_halved_reason_value
desc = COWED_REASON
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 2
}
}
}
modifier = { #Comparative military strength.
add = {
value = 1
subtract = {
value = scope:recipient.max_military_strength
divide = { value = scope:actor.max_military_strength min = 1 }
}
multiply = 100
}
desc = offer_vassalization_interaction_aibehavior_power_tt
}
modifier = { #Different faith, no pluralism.
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
}
}
desc = AI_REFUSAL_SPLITTING_SAME_FAITH_VASSALS
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 }
}
}
}
}
can_send_despite_rejection = yes
# AI
ai_targets = { ai_recipients = peer_vassals }
ai_frequency = 24
ai_potential = {
is_diarch = yes
has_realm_law_flag = title_revocation_allowed
primary_title.tier > tier_county
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_secondary_powers_base_value
# Additions.
## Opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = 0.25
}
## Personality.
ai_value_modifier = {
ai_boldness = 0.75
ai_honor = -0.5
}
## Traits.
### +++ Ambitious.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = ambitious
}
### +++ Greedy.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = greedy
}
### +++ Vengeful (under certain criteria).
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = vengeful
has_opinion_modifier = {
modifier = revoked_title
target = scope:recipient
}
}
### ++ Arbitrary.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = arbitrary
}
### - Generous.
modifier = {
add = diarch_ai_desire_minus_1_value
has_trait = generous
}
### -- Just.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = just
}
### --- Content.
modifier = {
add = diarch_ai_desire_minus_3_value
has_trait = content
}
## Always revoke preferred capital and capital duchy
modifier = {
add = 1000
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 }
}
}
# Always retract preferred capital duchy
modifier = {
add = 1000
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 }
}
}
## Slight preference for higher-tier titles
modifier = {
add = {
value = scope:secondary_recipient.highest_held_title_tier
multiply = 10
}
}
## We avoid wars here too, but only in the resulting event.
# Factors.
## Relationships.
### + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### - Try not to pick on allies of our liege.
modifier = {
factor = 0.25
should_avoid_hostile_action_against_due_to_liege_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on players unless they're of at least a decent size.
modifier = {
factor = 0
scope:recipient = {
is_ai = no
any_held_county = { count <= 3 }
}
}
### x0 Exempt the party baron.
modifier = {
factor = 0
scope:recipient = { has_character_flag = is_party_baron }
}
}
}
# Diarch (actor) imprisons a character (recipient) who's a sub-realm character of their liege, with an optional veto for the liege (third_party).
diarch_imprison_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
interface_priority = 16
notification_text = DIARCH_IMPRISON_PROPOSAL
intermediary_notification_text = diarch_interaction_requesting_sign_off.tt
intermediary_breakdown_yes = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_YES
intermediary_breakdown_no = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_NO
intermediary_breakdown_maybe = ANSWER_TRILATERAL_INTERMEDIARY_LIEGE_MAYBE
intermediary_answer_accept_key = REPLY_ANSWER_ALLOW
intermediary_answer_reject_key = REPLY_ANSWER_VETO
pre_answer_yes_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_YES
pre_answer_no_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_NO
pre_answer_maybe_breakdown_key = ANSWER_TRILATERAL_RECIPIENT_MAYBE
icon = prison
redirect = {
scope:actor.liege ?= { save_scope_as = intermediary }
}
desc = diarch_imprison_interaction_desc
send_name = diarch_imprison_interaction.send_name
ai_maybe = yes
ai_intermediary_maybe = yes
can_send_despite_rejection = yes
popup_on_receive = yes
pause_on_receive = yes
interface_priority = 60
ai_min_reply_days = 4
ai_max_reply_days = 9
on_decline_summary = diarch_rebel_or_crime_summary.crominal
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
# The prisoner goes to your dungeon, so we want you to actually have one.
is_landed_or_landless_administrative = yes
}
# Make sure scope:recipient is suitable.
scope:recipient = { is_imprisoned = no }
# Scope:recipient can't be visiting elsewhere.
trigger_if = {
limit = {
scope:recipient = { is_courtier = yes }
}
NOT = {
scope:recipient.host = {
any_foreign_court_guest = { this = scope:recipient }
}
}
}
# Finally, make sure this isn't someone scope:actor could use the conventional interaction on.
scope:actor = {
liege = {
basic_allowed_to_imprison_character_trigger = { CHARACTER = scope:recipient }
}
NOT = {
basic_allowed_to_imprison_character_trigger = { CHARACTER = scope:recipient }
}
}
}
is_valid = {
# Here to correct for some dodgy inheritance situations.
NOT = { scope:actor = scope:intermediary }
}
is_valid_showing_failures_only = {
scope:actor = {
advanced_allowed_to_imprison_character_trigger = { CHARACTER = scope:recipient }
}
imprison_neutral_is_valid_showing_failures_only_triggers_trigger = yes
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_a_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_diarch_imprison_interaction }
scope:actor.liege = {
trigger_if = {
limit = { has_realm_law_flag = imprisonment_toggle_enable } #Present on all tribal authority to disable imprisonment
has_realm_law_flag = imprisonment_toggle_on #Present from tribal authority level 1 to re-enable imprisonment
}
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
cooldown = { years = 1 }
cooldown_against_recipient = { years = 3 }
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
is_highlighted = {
scope:recipient = { is_imprisoned = no }
scope:actor = { has_imprisonment_reason = scope:recipient }
}
#Use hook
send_option = {
is_valid = {
exists = scope:recipient
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
on_send = {
scope:actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
}
}
on_auto_accept = {
scope:actor = { trigger_event = char_interaction.0281 }
diarch_imprison_general_accept_effect = yes
}
on_accept = {
if = {
limit = { scope:hook = yes }
scope:actor = { use_hook = scope:recipient }
}
# Tell them that the imprisonment went through fine.
scope:actor = { trigger_event = char_interaction.0282 }
save_scope_value_as = {
name = use_strife_not_tyranny
value = yes
}
diarch_imprison_general_accept_effect = yes
# Debug logging.
debug_log = debug_log.diarch_imprison.accepted
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_imprison_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_accept_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_accept_intermediary_list }
}
}
on_intermediary_decline = {
# Scope:intermediary eats a prestige cost for their veto.
scope:intermediary = { add_prestige = liege_diarchy_veto_prestige_cost_medium }
scope:actor = {
# Inform scope:actor that their liege has vetoed them.
## First, we log which interaction this is for the event's effects.
save_scope_value_as = {
name = diarch_interaction
value = flag:imprison
}
## Then, fire the event.
trigger_event = char_interaction.0291
# Scope:actor can be hostile again.
clear_hostile_actions_lock_flag_effect = yes
}
# Inform scope:recipient that scope:intermediary has their back.
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_good
title = diarch_action_vetoed.tt
left_icon = scope:actor
right_icon = scope:intermediary
custom_tooltip = diarch_imprison_interaction.tt.inform_recipient
}
}
# Flick out some opinions.
diarch_imprison_interaction_intermediary_fail_opinions_effect = yes
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_imprison_veto }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_veto_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_veto_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_veto_intermediary_list }
}
}
on_decline = {
scope:actor = {
imprison_HoF_consequences_effect = yes
imprison_tyranny_effect = yes
}
# Do we want a war or an escape?
scope:recipient = {
# If target is count or higher, we want the option to start a war.
if = {
limit = {
is_landed_or_landless_administrative = yes
highest_held_title_tier >= tier_county
}
# Send the choosing event.
scope:actor = { trigger_event = char_interaction.0283 }
# Display the choices in advance.
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = char_interaction.0263.result.criminal
diarch_declare_recipient_criminal_effect = yes
}
50 = {
show_chance = no
desc = char_interaction.0263.result.war
scope:recipient = {
start_war = {
casus_belli = remove_regent_cb
target = scope:actor
}
}
}
}
}
}
#If target is a baron or unlanded, have them escape.
else = {
if = { #To block them from being instantly rehired
limit = {
is_councillor_of = scope:actor
can_be_fired_from_council_trigger = { COURT_OWNER = scope:actor }
}
set_variable = {
name = escaped_imprisonment_from
value = scope:actor
years = 20
}
}
if = {
limit = { is_landed_or_landless_administrative = yes }
depose_effect = { DEPOSER = root }
}
if = {
limit = {
is_playable_character = no
trigger_if = {
limit = { is_councillor = yes }
can_be_fired_from_council_trigger = { COURT_OWNER = scope:recipient.liege }
}
trigger_if = {
limit = { exists = scope:actor.faith.religious_head }
NOT = { scope:actor.faith.religious_head = scope:recipient }
}
}
custom_tooltip = deposed_and_become_wanderer
select_and_move_to_pool_effect = yes
}
add_opinion = {
target = scope:actor
modifier = attempted_imprisonment_opinion
}
}
}
#Remove them as guardian/ward for any courtier (feedback given in char_interaction.0230)
scope:actor = {
if = {
limit = {
any_courtier = { has_relation_guardian = scope:recipient }
}
every_courtier = {
limit = { has_relation_guardian = scope:recipient }
save_scope_as = ward
remove_guardian_effect = {
GUARDIAN = scope:recipient
WARD = scope:ward
RETURN_WARD = yes
HIDE_OPINION = no
}
add_to_list = ward_children
}
}
if = {
limit = {
any_courtier = { has_relation_ward = scope:recipient }
}
random_courtier = {
limit = { has_relation_ward = scope:recipient }
save_scope_as = guardian
show_as_tooltip = {
remove_guardian_effect = {
GUARDIAN = scope:guardian
WARD = scope:recipient
RETURN_WARD = yes
HIDE_OPINION = no
}
}
add_to_list = guardian_list
}
hidden_effect = {
scope:guardian = {
send_interface_message = {
type = event_childhood_neutral
title = remove_guardian_interaction_notification
left_icon = scope:recipient
right_icon = scope:guardian
remove_guardian_effect = {
GUARDIAN = scope:guardian
WARD = scope:recipient
RETURN_WARD = yes
HIDE_OPINION = no
}
}
}
}
}
}
# Misc clean-up stuff.
scope:actor = {
if = {
limit = {
scope:recipient = {
OR = {
is_playable_character = no
AND = {
is_landed_or_landless_administrative = yes
primary_title.tier = tier_barony
}
}
}
}
trigger_event = char_interaction.0230
}
}
if = {
limit = {
scope:actor = { has_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = { remove_character_flag = flag_hostile_actions_disabled_delay }
}
# Debug logging.
debug_log = debug_log.diarch_imprison.rejected
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_imprison_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_decline_recipient_list }
}
scope:intermediary = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_imprison_decline_intermediary_list }
}
}
auto_accept = no
ai_intermediary_accept = {
# The AI should be inclined to trust their regent, at least a little.
base = 0
modifier = { add = liege_trust_diarch_trilateral_interaction_default_value }
# Standard modifiers.
intermediary_liege_will_accept_standard_modifiers = {
CURRENCY = prestige
COST = liege_diarchy_veto_prestige_cost_medium
}
}
ai_accept = {
base = 0 # Try to make it 0 for most interactions
modifier = {
add = {
value = scope:actor.intrigue
multiply = 1
}
desc = IMPRISON_INTRIGUE_ACTOR
}
modifier = {
add = {
value = scope:recipient.intrigue
multiply = -2
}
desc = IMPRISON_INTRIGUE_RECIPIENT
}
modifier = {
add = 30
desc = SCHEME_HOOK_USED
scope:hook = yes
}
opinion_modifier = { # Opinion Factor
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.5
desc = AI_OPINION_REASON
}
ai_value_modifier = {
who = scope:recipient
ai_boldness = {
if = {
limit = {
scope:recipient = { NOT = { ai_boldness = 0 } }
}
value = -0.5
}
}
}
modifier = {
add = 20
desc = AI_REFUSAL_IS_TREASON
scope:actor = {
any_vassal_or_below = { this = scope:recipient }
has_realm_law_flag = vassal_refusal_is_treason
}
}
modifier = {
add = 50
desc = AI_PRISON_FEUDAL_COMPLEX_PERK
scope:actor = {
has_perk = prison_feudal_complex_perk
}
}
modifier = { #I am a King!
add = -40
desc = offer_vassalization_interaction_aibehavior_amkingtier_tt
scope:recipient = { highest_held_title_tier = tier_kingdom }
}
modifier = { #Courtiers.
add = 50
desc = AI_REFUSAL_COURTIER
scope:recipient = { is_ruler = no }
}
modifier = { # Your young children can't really stop you
add = 200
desc = AI_REFUSAL_YOUNG_CHILD
scope:recipient = {
is_child_of = scope:actor
is_courtier_of = scope:actor
is_adult = no
}
}
modifier = { #They're a claimant against you
add = -70
desc = AI_CLAIMANT_PENALTY
scope:actor = {
OR = {
any_targeting_faction = {
faction_is_type = claimant_faction
faction_is_at_war = yes
exists = special_character
special_character = scope:recipient
}
AND = {
exists = var:claimant_faction_sent_demand
var:claimant_faction_sent_demand = scope:recipient
}
}
}
}
modifier = { #Rank difference.
add = {
value = -15
if = {
limit = {
scope:actor = {
tier_difference = {
target = scope:recipient
value >= 2
}
}
}
add = 5
}
if = {
limit = {
scope:actor = {
tier_difference = {
target = scope:recipient
value >= 3
}
}
}
add = 5
}
if = { #King asking Baron, modifier becomes positive.
limit = {
scope:actor = {
tier_difference = {
target = scope:recipient
value >= 4
}
}
}
add = 10
}
}
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:recipient = {
is_ruler = yes
highest_held_title_tier < tier_kingdom
}
}
modifier = {
add = intimidated_external_reason_value
desc = INTIMIDATED_REASON
scope:recipient = {
NOT = { target_is_liege_or_above = scope:actor }
has_dread_level_towards = {
target = scope:actor
level = 1
}
}
}
modifier = {
add = cowed_external_reason_value
desc = COWED_REASON
scope:recipient = {
NOT = { target_is_liege_or_above = scope:actor }
has_dread_level_towards = {
target = scope:actor
level = 2
}
}
}
modifier = { #Comparative military strength.
add = {
value = 1
subtract = {
value = scope:recipient.max_military_strength
divide = { value = scope:actor.max_military_strength min = 1 }
}
multiply = 100
min = -1000
# This max needs to match the loc in offer_vassalization_interaction_aibehavior_power_tt
max = 20
}
desc = offer_vassalization_interaction_aibehavior_power_tt
scope:actor = { is_ruler = yes }
scope:recipient = { is_ruler = yes }
}
modifier = { #Rivalry modifier.
add = -50
desc = offer_vassalization_interaction_aibehavior_rival_tt
scope:recipient = {
has_relation_rival = scope:actor
NOT = { has_relation_nemesis = scope:actor }
}
}
modifier = { #Nemesis modifier.
add = -100
desc = offer_vassalization_interaction_aibehavior_nemesis_tt
scope:recipient = {
has_relation_nemesis = scope:actor
}
}
modifier = {
add = 10
desc = GRANDEUR_REASON
scope:recipient = { has_royal_court = no }
scope:actor = {
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level >= 7
court_grandeur_current_level < 9
}
}
modifier = {
add = 20
desc = GRANDEUR_REASON
scope:recipient = { has_royal_court = no }
scope:actor = {
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level >= 9
}
}
modifier = { # Legalistic tradition
add = legalistic_vassal_punishment_acceptance
desc = tradition_legalistic_name
scope:actor = {
has_imprisonment_reason = scope:recipient
culture = { has_cultural_parameter = vassals_more_likely_accept_punishments }
}
}
}
# AI
ai_targets = { ai_recipients = peer_vassals }
ai_targets = { ai_recipients = scripted_relations }
ai_frequency = 12
ai_will_do = {
# You should have a _reason_ to try to imprison someone.
base = 0
# Additions.
## Opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = 0.5
}
## Personality.
ai_value_modifier = {
ai_vengefulness = 1
ai_boldness = 0.5
}
## Flag Management.
### Make sure the AI uses hooks for this as it's % based
modifier = {
add = 1
scope:hook = yes
}
## Traits.
### +++ Sadistic.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = greedy
}
### +++ Vengeful.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = vengeful
}
### ++ Just (under certain circumstances).
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = just
has_imprisonment_reason = scope:recipient
}
### -- Compassionate.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = compassionate
}
### --- Forgiving.
modifier = {
add = diarch_ai_desire_minus_3_value
has_trait = forgiving
}
## We avoid wars here too, but only in the resulting event.
## Agenda impact
modifier = {
add = {
value = 0
if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_important }
has_character_flag = agenda_towards_escalation
}
}
add = 200
}
else_if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_important }
}
}
add = -100
}
}
any_character_struggle = { involvement = involved }
}
modifier = {
add = {
value = 0
if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_detractor }
has_trait = fp3_struggle_supporter
}
}
add = 200
}
else_if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_detractor }
}
}
add = -100
}
}
any_character_struggle = { involvement = involved }
}
modifier = {
add = {
value = 0
if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_supporter }
has_trait = fp3_struggle_detractor
}
}
add = 200
}
else_if = {
limit = {
scope:actor = {
any_character_struggle = { phase_has_catalyst = catalyst_imprison_supporter }
}
}
add = -100
}
}
any_character_struggle = { involvement = involved }
}
# Factors.
## Relationships.
### + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### - Try not to pick on allies of our liege.
modifier = {
factor = 0.25
should_avoid_hostile_action_against_due_to_liege_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
### x0 Don't pick on people without due reason unless we really hate them.
#### Doesn't quite double up with the above factor increase for folks we hate - we want to prioritise them, but we also want to enable them for arbitrary punishment.
modifier = {
factor = 0
NOR = {
has_imprisonment_reason = scope:recipient
has_any_bad_relationship_with_character_trigger = { CHARACTER = scope:recipient }
# Sadists wants to torture folks.
has_trait = sadistic
# Agents get a time-out.
any_targeting_scheme = {
hostile_scheme_trigger = yes
is_scheme_agent_exposed = scope:recipient
}
# Prior crimes annoy people.
has_any_major_revenge_opinion_against_character_trigger = { CHARACTER = scope:recipient }
# Vengeful characters can be a pain over even minor matters.
AND = {
OR = {
has_trait = vengeful
ai_vengefulness >= very_high_positive_ai_value
}
has_any_petty_revenge_opinion_against_character_trigger = { CHARACTER = scope:recipient }
}
}
}
}
}
# Diarch (actor) offers to boost the CA/TA/IB of liege (recipient), taking on the costs and negatives themselves so that they can use their diarch powers.
diarch_subsidise_crown_authority_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
notification_text = DIARCH_SUBSIDISE_AUTHORITY_PROPOSAL
icon = icon_contract_modification_single
desc = diarch_subsidise_crown_authority_interaction_desc
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
liege_has_co_emperorship_trigger = no
}
# Same sub-realm only.
OR = {
scope:actor.liege = scope:recipient
scope:recipient = {
any_liege_or_above = { this = scope:actor.liege }
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = diarch_can_subsidise_liege_authority }
# Can't subisidise past the point needed.
custom_tooltip = {
text = diarch_subsidise_crown_authority_interaction.tt.cannot_subsidise_past_necessary
scope:recipient = {
NOT = { has_realm_law_flag = diarchs_want_to_subsidise_without_this_flag }
}
}
# And the liege can't have the max level of authority.
custom_tooltip = {
text = diarch_subsidise_crown_authority_interaction.tt.liege_cannot_have_max_authority
scope:recipient = {
NOT = { has_realm_law_flag = max_authority_level }
}
}
# Aaaand, if you're not tribal/administrative, we need to check some innovations.
scope:recipient = {
# CA0 -> CA1.
trigger_if = {
limit = { has_realm_law = crown_authority_0 }
can_pass_law_ca1_trigger = yes
}
# CA1 -> CA2.
trigger_if = {
limit = { has_realm_law = crown_authority_1 }
can_pass_law_ca2_trigger = yes
}
# CA2 -> CA3.
trigger_if = {
limit = { has_realm_law = crown_authority_2 }
can_pass_law_ca3_trigger = yes
}
# If the liege is administrative, they have to be independent.
trigger_if = {
limit = { has_government = administrative_government }
is_independent_ruler = yes
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
# Why the hell not? If your liege dies several times in quick succession, sure, centralise all the power you like. That'll go well.
cooldown_against_recipient = { years = 10 }
cost = {
prestige = {
value = scope:recipient.increase_crown_authority_prestige_cost
multiply = subsidised_liege_authority_discount_value
}
}
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_good
title = diarch_subsidise_crown_authority_interaction.tt.accepted
left_icon = scope:recipient
scope:recipient = {
# Try to change authority.
increase_crown_authority_effect = yes
increase_tribal_authority_effect = yes
increase_imperial_bureaucracy_effect = yes
# No one blames the liege for this.
add_character_modifier = {
modifier = liege_authority_boost_has_scapegoat_modifier
years = 10
}
}
# Aaaaand everyone knows what you did.
change_strife_opinion = massive_strife_gain
}
}
}
on_decline = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_bad
title = diarch_subsidise_crown_authority_interaction.tt.declined
left_icon = scope:recipient
add_opinion = {
target = scope:recipient
modifier = refusal_opinion
opinion = -20
}
}
}
}
ai_accept = {
base = 0
# You want to do _what_? For free?
modifier = {
add = 100
desc = diarch_subsidise_crown_authority_interaction.tt.absolutely_yes_please
always = yes
}
}
auto_accept = {
custom_description = {
text = auto_accept_interaction_ai
object = scope:recipient
scope:recipient = {
is_ai = yes
}
}
}
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 24
ai_potential = {
is_diarch = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
# You also need prestige left over afterwards to use other interactions, so make sure the AI doesn't bankrupt itself on this.
prestige >= {
value = liege.increase_crown_authority_prestige_cost
multiply = subsidised_liege_authority_discount_value
add = major_prestige_value
}
}
ai_will_do = {
base = 0
# Government situation.
## Does your liege's gubermint allow you to bully people and take their stuff? No? Then you want to take this interaction; anyone who wouldn't has been pre-filtered.
modifier = {
add = 1000
liege = {
NOR = {
has_realm_law_flag = title_revocation_allowed
has_realm_law_flag = vassal_retraction_allowed
}
}
}
}
}
# Diarch (actor) requests an adjustment of liege's (recipient's) IB, taking on the costs and negatives themselves _or_ reducing their strife, depending on whether they boost centralisation or decrease it.
diarch_adjust_bureaucracy_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
interface_priority = 9
notification_text = {
first_valid = {
# Decentralise.
triggered_desc = {
trigger = { scope:decrease_centralisation = yes }
desc = DIARCH_ADJUST_BUREAUCRACY_PROPOSAL.DECENTRALISE
}
# Centralise.
desc = DIARCH_ADJUST_BUREAUCRACY_PROPOSAL.CENTRALISE
}
}
icon = icon_contract_modification_single
desc = diarch_adjust_bureaucracy_interaction_desc
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
liege_has_co_emperorship_trigger = yes
}
# Same sub-realm only.
OR = {
scope:actor.liege = scope:recipient
scope:recipient = {
any_liege_or_above = { this = scope:actor.liege }
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_adjust_imperial_bureaucracy_interaction }
# And the liege can't have the max level of authority.
custom_tooltip = {
text = diarch_subsidise_crown_authority_interaction.tt.liege_cannot_have_max_authority
scope:recipient = {
NOT = { has_realm_law_flag = max_authority_level }
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
# Co-emperors can't keep doing this in quick succession.
cooldown = { years = 10 }
cost = {
prestige = {
value = scope:recipient.increase_crown_authority_prestige_cost
if = {
limit = { scope:increase_centralisation = yes }
multiply = subsidised_liege_authority_discount_value
}
else = { multiply = lowered_liege_authority_discount_value }
}
}
# Increase IB
send_option = {
flag = increase_centralisation
is_valid = {
scope:recipient = {
NOT = { has_realm_law = imperial_bureaucracy_3 }
}
}
localization = increase_centralisation_name
current_description = increase_centralisation
starts_enabled = { always = yes }
}
# Decrease IB
## The AI doesn't use this.
send_option = {
flag = decrease_centralisation
is_valid = {
scope:recipient = {
NOT = { has_realm_law = imperial_bureaucracy_0 }
}
}
localization = decrease_centralisation_name
current_description = decrease_centralisation
}
on_send = {
# Tell the AI to set their only send option.
if = {
limit = {
scope:actor = { is_ai = yes }
}
save_scope_value_as = {
name = increase_centralisation
value = yes
}
}
}
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_good
title = diarch_subsidise_crown_authority_interaction.tt.accepted
left_icon = scope:recipient
scope:recipient = {
# Try to change authority.
if = {
limit = { scope:increase_centralisation = yes }
increase_imperial_bureaucracy_effect = yes
# No one blames the liege for this.
add_character_modifier = {
modifier = liege_authority_boost_has_scapegoat_modifier
years = 10
}
}
else = { decrease_imperial_bureaucracy_effect = yes }
}
# Aaaaand everyone knows what you did.
## For good.
if = {
limit = { scope:increase_centralisation = yes }
change_strife_opinion = massive_strife_gain
}
## Or for ill.
else = { change_strife_opinion = massive_strife_loss }
}
}
}
on_decline = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_bad
title = diarch_subsidise_crown_authority_interaction.tt.declined
left_icon = scope:recipient
add_opinion = {
target = scope:recipient
modifier = refusal_opinion
opinion = -20
}
}
}
}
ai_accept = {
base = -25
# Opinion Factor
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.5
desc = AI_OPINION_REASON
}
# Your level of influence.
## Impotent
modifier = {
add = -10
desc = AI_OPINION_INFLUENCE_LEVEL_IMPOTENT
scope:actor.influence_level = 0
}
## Influential
### Would be zero, so it wouldn't appear.
## Persuasive
modifier = {
add = 10
desc = AI_OPINION_INFLUENCE_LEVEL_PERSUASIVE
scope:actor.influence_level = 2
}
## Controlling
modifier = {
add = 20
desc = AI_OPINION_INFLUENCE_LEVEL_CONTROLLING
scope:actor.influence_level = 3
}
## Authoritative
modifier = {
add = 30
desc = AI_OPINION_INFLUENCE_LEVEL_AUTHORITATIVE
scope:actor.influence_level = 4
}
## Imperious
modifier = {
add = 40
desc = AI_OPINION_INFLUENCE_LEVEL_IMPERIOUS
scope:actor.influence_level = 5
}
# Traits.
## --- Arrogant
modifier = {
add = -30
desc = ai_acceptance_trait_arrogant
scope:recipient = { has_trait = arrogant }
}
## --- Ambitious
modifier = {
add = -30
desc = ai_acceptance_trait_ambitious
scope:recipient = { has_trait = ambitious }
}
## --- Stubborn
modifier = {
add = -30
desc = ai_acceptance_trait_stubborn
scope:recipient = { has_trait = stubborn }
}
## -- Paranoid
modifier = {
add = -20
desc = ai_acceptance_trait_paranoid
scope:recipient = { has_trait = paranoid }
}
## + Craven
modifier = {
add = 10
desc = ai_acceptance_trait_craven
scope:recipient = { has_trait = craven }
}
## ++ Trusting
modifier = {
add = 20
desc = ai_acceptance_trait_trusting
scope:recipient = { has_trait = trusting }
}
## ++ Fickle
modifier = {
add = 20
desc = ai_acceptance_trait_fickle
scope:recipient = { has_trait = fickle }
}
## +++ Content
modifier = {
add = 30
desc = ai_acceptance_trait_content
scope:recipient = { has_trait = content }
}
## +++ Humble
modifier = {
add = 30
desc = ai_acceptance_trait_humble
scope:recipient = { has_trait = humble }
}
# Factor for personality.
ai_value_modifier = {
who = scope:recipient
# The meeker they are, the more they'll go along with your wishes.
ai_boldness = {
if = {
limit = {
scope:recipient = {
NOT = { ai_boldness = 0 }
}
}
value = -1
}
}
# And the lazier.
ai_energy = {
if = {
limit = {
scope:recipient = { ai_energy > 0 }
}
value = 0.5
}
}
}
}
auto_accept = {
custom_description = {
text = auto_accept_interaction_ai
object = scope:recipient
scope:recipient = {
is_ai = yes
scope:increase_centralisation = yes
}
}
}
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 24
ai_potential = {
is_diarch = yes
liege_has_co_emperorship_trigger = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
# You also need prestige left over afterwards to use other interactions, so make sure the AI doesn't bankrupt itself on this.
prestige >= {
value = liege.increase_crown_authority_prestige_cost
multiply = subsidised_liege_authority_discount_value
add = major_prestige_value
}
}
ai_will_do = {
base = 0
# Government situation.
## Does your liege's gubermint allow you to bully people and take their stuff? No? Then you want to take this interaction; anyone who wouldn't has been pre-filtered.
modifier = {
add = 1000
liege = {
NOR = {
has_realm_law_flag = title_revocation_allowed
has_realm_law_flag = vassal_retraction_allowed
}
}
}
# Otherwise, there's just a slight constant chance based on energy.
ai_value_modifier = {
ai_energy = 2
# Assuming you're the heir, as otherwise...
trigger = { liege.player_heir ?= root }
}
}
}
##################################################
# ANCILLARY DIARCH POWERS
# Diarch (actor) either tests learning or spends prestige to gain an unpressed claim on a title held by a vassal of their liege (recipient).
diarch_legal_meddling_interaction = {
category = interaction_category_diarch
common_interaction = yes
interface_priority = 165
diarch_interaction = yes
icon = vassal_claim_liege_title_interaction
desc = diarch_legal_meddling_interaction_desc
ai_intermediary_maybe = yes
target_type = title
target_filter = recipient_domain_titles
popup_on_receive = yes
interface_priority = 60
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
}
# Make sure scope:recipient is suitable.
scope:recipient = {
# We only target vassals of the liege...
liege = scope:actor.liege
NOT = { this = scope:actor.liege }
# ... who are appropriately landed.
is_landed_or_landless_administrative = yes
scope:recipient.highest_held_title_tier >= tier_county
}
}
is_valid_showing_failures_only = {
# You can't claim a title from someone if you already have claims on all their titles.
custom_tooltip = {
text = diarch_legal_meddling_interaction.tt.they_must_have_at_least_one_unclaimed_title
scope:recipient = {
any_held_title = {
diarch_legal_meddling_claimable_title_trigger = { ACTOR = scope:actor }
}
}
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_a_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_legal_meddling_interaction }
}
# Must select something.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:diarch_legal_meddling_interaction_duel_learning = yes
scope:diarch_legal_meddling_interaction_pay_prestige_partial = yes
scope:diarch_legal_meddling_interaction_pay_prestige_full = yes
}
}
}
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
cooldown = { months = 6 }
cooldown_against_recipient = { years = 3 }
can_be_picked_title = {
scope:target = {
# Really anything you don't already have a claim on and which isn't special.
diarch_legal_meddling_claimable_title_trigger = { ACTOR = scope:actor }
}
}
# Attempt Methods
send_options_exclusive = yes
## Duel for it.
send_option = {
# You can always try to duel for it.
flag = diarch_legal_meddling_interaction_duel_learning
}
## Pay partial prestige.
send_option = {
is_valid = {
scope:actor = {
prestige >= {
value = legal_meddling_interaction_title_discounted_cost_value
multiply = -1
}
}
}
flag = diarch_legal_meddling_interaction_pay_prestige_partial
}
## Pay full prestige.
send_option = {
is_valid = {
scope:actor = {
prestige >= {
value = legal_meddling_interaction_title_cost_value
multiply = -1
}
}
}
flag = diarch_legal_meddling_interaction_pay_prestige_full
}
on_send = {
# Did a landless diarch send this?
log_diarch_send_interaction_as_variable_effect = { INTERACTION = forge_claim }
}
on_accept = {
scope:actor = {
# Resolution method.
## If we're duelling, then we duel.
if = {
limit = { scope:diarch_legal_meddling_interaction_duel_learning = yes }
# Now: FIGHT! WITH WORDS!
duel = {
skill = learning
target = scope:recipient
# Victory! A claim for you.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = diarch_legal_meddling_interaction.tt.success
diarch_legal_meddling_interaction_apply_success_effect = yes
}
# Defeat! Into the loser's bin you go.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = diarch_legal_meddling_interaction.tt.failure
diarch_legal_meddling_interaction_apply_fail_effect = yes
}
}
}
## Otherwise we can take an uneven gamble against a reduced prestige cost..
else_if = {
limit = { scope:diarch_legal_meddling_interaction_pay_prestige_partial = yes }
random_list = {
# Victory! A claim for you.
100 = {
desc = diarch_legal_meddling_interaction.tt.success
diarch_legal_meddling_interaction_apply_success_effect = yes
}
# Defeat! Into the loser's bin you go.
100 = {
desc = diarch_legal_meddling_interaction.tt.failure
diarch_legal_meddling_interaction_apply_fail_effect = yes
}
}
}
## Or pay the full price.
else = {
custom_tooltip = diarch_legal_meddling_interaction.tt.success
diarch_legal_meddling_interaction_apply_success_effect = yes
}
}
# Debug logging.
debug_log = debug_log.legal_meddling.attempt_made
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = peer_vassals }
ai_frequency = 6
ai_potential = {
is_diarch = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_core_loop_base_value
# Additions.
## Weight for opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -1
}
## Weight for personality.
ai_value_modifier = {
ai_boldness = 0.25
ai_greed = 0.5
ai_honor = 0.5
}
## Flag Management.
### Duel for it if we're massively superior.
modifier = {
add = 100
scope:diarch_legal_meddling_interaction_duel_learning = yes
learning_diff = {
target = scope:recipient
value >= @ai_skill_diff_upper_threshold
}
}
### Else we'll try to pay full prestige, if we've got lots to spare.
modifier = {
add = 50
scope:diarch_legal_meddling_interaction_pay_prestige_full = yes
prestige >= {
value = shift_privileges_interaction_target_cost_value
multiply = @ai_prestige_bank_threshold
}
}
### Or else we'll to chance it, if we can afford that + some slack.
modifier = {
add = 25
scope:diarch_legal_meddling_interaction_pay_prestige_partial = yes
prestige < {
value = shift_privileges_interaction_target_cost_value
multiply = @ai_prestige_bank_threshold
}
prestige >= {
value = shift_privileges_interaction_target_discounted_cost_value
multiply = @ai_prestige_bank_threshold
}
}
### Otherwise we'll risk a regular duel.
## Weight up for bordering or de jure areas.
modifier = {
add = 50
is_landed_or_landless_administrative = yes
any_sub_realm_county = {
any_neighboring_county = {
holder = {
OR = {
this = scope:recipient
any_liege_or_above = { this = scope:recipient }
}
}
}
}
}
modifier = {
add = 50
is_landed_or_landless_administrative = yes
scope:actor = {
any_held_title = {
any_direct_de_jure_vassal_title = {
exists = holder
holder = {
OR = {
this = scope:recipient
this = {
any_liege_or_above = { this = scope:recipient }
}
}
}
}
}
}
}
## Weight down for folks outside of our de jure kingdom.
modifier = {
add = -100
is_landed_or_landless_administrative = yes
scope:recipient.primary_title.kingdom ?= {
NOT = { this = scope:actor.primary_title.kingdom }
}
}
## Landless characters want land, but also want to focus on taking from those who might give it up.
### So we prioritise hooked AI counts.
modifier = {
add = 100
is_landed = no
has_hook = scope:recipient
scope:recipient = {
highest_held_title_tier = tier_county
is_ai = yes
}
}
### Then just hooked AI.
modifier = {
add = 50
is_landed = no
has_hook = scope:recipient
scope:recipient = { is_ai = yes }
}
# Factors.
## + Weight up if we're lacking valid claims
modifier = {
factor = 1.5
NOR = {
is_claimant = yes
any_claim = {
exists = holder
exists = holder.liege
holder.liege = scope:actor.liege
}
}
}
## + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## + If we're landless, turbo charge this when we lack suitable claims.
modifier = {
factor = 3
scope:actor = {
is_ruler = no
any_claim = {
count < @ai_threshold_for_revoke_cyle
diarch_legal_meddling_claimable_title_trigger = { ACTOR = scope:actor }
}
}
}
## + If we're landless, try to prioritise anyone we've got a hook on.
modifier = {
factor = 2
scope:actor = {
is_ruler = no
has_usable_hook = scope:recipient
}
}
## - Try not to pick on allies of our liege.
modifier = {
factor = 0.25
should_avoid_hostile_action_against_due_to_liege_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## x0 Don't pick on players unless they're of at least a decent size.
modifier = {
factor = 0
scope:recipient = {
is_ai = no
any_held_county = { count <= 3 }
}
}
## x0 If we're landless, don't claim more titles if we've already got enough we can try to action.
modifier = {
factor = 0
scope:actor = {
is_ruler = no
any_claim = {
count >= @ai_threshold_for_revoke_cyle
diarch_legal_meddling_claimable_title_trigger = { ACTOR = scope:actor }
}
}
}
## x0 If we're landless, don't pick on people who won't give their lands up.
modifier = {
factor = 0
scope:actor = { is_ruler = no }
scope:recipient = {
any_held_county = { count <= 1 }
}
}
### x0 Don't go into prestige debt!
modifier = {
factor = 0
prestige < 0
}
}
}
# Diarch (actor) either tests stewardship or spends prestige to gain gold at the expense of negative modifiers delivered to the liege (recipient).
diarch_syphon_treasury_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
icon = icon_gold
common_interaction = yes
desc = diarch_syphon_treasury_interaction_desc
interface_priority = 60
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
}
# Make sure scope:recipient is suitable.
scope:recipient = {
OR = {
# We only target the liege...
this = scope:actor.liege
# ... but we want to see it for peer-vassals and such.
any_liege_or_above = { this = scope:actor.liege }
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# If scope:actor's stewardship is too crap, then we need to make sure they haven't somehow managed to riddle scope:recipient's lands with negative modifiers already.
trigger_if = {
limit = { scope:actor.stewardship < syphon_treasury_stewardship_medium }
custom_tooltip = {
text = diarch_syphon_treasury_interaction.tt.not_enough_marks_or_stewardship
scope:recipient = {
any_held_county = { diarch_syphon_treasury_embezzlement_modifiers_trigger = no }
}
}
}
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_a_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_syphon_treasury_interaction }
}
# Must have selected an amount to embezzle.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = diarch_interactions.tt.must_embezzle_something
OR = {
scope:diarch_syphon_treasury_sum_small = yes
scope:diarch_syphon_treasury_sum_medium = yes
scope:diarch_syphon_treasury_sum_large = yes
scope:diarch_syphon_treasury_sum_huge = yes
}
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
cooldown = { years = 3 }
# Attempt Methods
send_options_exclusive = yes
## Steal a small sum.
### Bonus to scope:actor.
send_option = {
flag = diarch_syphon_treasury_sum_small
# We're doing gross overrides here so that we don't need to relocalise some perfectly good stuff.
localization = diarch_syphon_treasury_sum_small_name
current_description = diarch_syphon_treasury_sum_small
}
## Steal a moderate sum.
### No bonus, no malus.
send_option = {
flag = diarch_syphon_treasury_sum_medium
# We're doing gross overrides here so that we don't need to relocalise some perfectly good stuff.
localization = diarch_syphon_treasury_sum_medium_name
current_description = diarch_syphon_treasury_sum_medium
starts_enabled = { always = yes }
}
## Steal a large sum.
### Malus to scope:actor
send_option = {
flag = diarch_syphon_treasury_sum_large
# We're doing gross overrides here so that we don't need to relocalise some perfectly good stuff.
localization = diarch_syphon_treasury_sum_large_name
current_description = diarch_syphon_treasury_sum_large
}
## Steal a _huge_sum.
### _Huge_ malus to scope:actor.
send_option = {
flag = diarch_syphon_treasury_sum_huge
# We're doing gross overrides here so that we don't need to relocalise some perfectly good stuff.
localization = diarch_syphon_treasury_sum_huge_name
current_description = diarch_syphon_treasury_sum_huge
}
on_send = {
# Did a landless diarch send this?
log_diarch_send_interaction_as_variable_effect = { INTERACTION = embezzle }
}
on_accept = {
# Time for a skill duel!
scope:actor = {
duel = {
skill = stewardship
value = syphon_treasury_duel_target_value
# Victory! Gold for scope:actor, maluses for the liege.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
# Bonus for smaller amounts.
modifier = {
add = 25
always = scope:diarch_syphon_treasury_sum_small
}
# You always have some kind of a chance.
min = 10
desc = diarch_syphon_treasury_interaction.tt.success
# Inform scope:actor what type of embezzlement they'll be pursuing.
## Very high stewardship characters syphon development growth from a few counties.
if = {
limit = { stewardship >= syphon_treasury_stewardship_very_high }
custom_tooltip = diarch_syphon_treasury_interaction.tt.success.syphon_development_growth
}
## High stewardship characters syphon some control from various counties.
else_if = {
limit = { stewardship >= syphon_treasury_stewardship_high }
custom_tooltip = diarch_syphon_treasury_interaction.tt.success.syphon_control_several_counties
}
## Medium stewardship characters syphon lots of control from one county.
else_if = {
limit = { stewardship >= syphon_treasury_stewardship_medium }
custom_tooltip = diarch_syphon_treasury_interaction.tt.success.syphon_control_county
}
## Low stewardship characters apply county modifiers.
else = { custom_tooltip = diarch_syphon_treasury_interaction.tt.success.apply_county_modifier }
# Now we sort the actual effects.
## A nice toast to tell us about our new gold.
send_interface_toast = {
type = event_toast_effect_good
title = diarch_syphon_treasury_interaction.tt.success
left_icon = scope:recipient
# Transfer gold.
## Small amount.
if = {
limit = { always = scope:diarch_syphon_treasury_sum_small }
give_or_update_embezzler_secret_effect = {
TARGET = scope:recipient
STAKE = syphon_treasury_gold_gain_low
}
add_gold = syphon_treasury_gold_gain_low
}
## Medium amount.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_medium }
give_or_update_embezzler_secret_effect = {
TARGET = scope:recipient
STAKE = syphon_treasury_gold_gain_medium
}
add_gold = syphon_treasury_gold_gain_medium
}
## Large amount.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_large }
give_or_update_embezzler_secret_effect = {
TARGET = scope:recipient
STAKE = syphon_treasury_gold_gain_high
}
add_gold = syphon_treasury_gold_gain_high
}
## Huge amount.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_huge }
give_or_update_embezzler_secret_effect = {
TARGET = scope:recipient
STAKE = syphon_treasury_gold_gain_very_high
}
add_gold = syphon_treasury_gold_gain_very_high
}
}
## Plus the maluses for the liege.
scope:recipient = {
# Very high stewardship characters syphon development growth from a few counties.
if = {
limit = { scope:actor.stewardship >= syphon_treasury_stewardship_very_high }
# Gold transfer was...
## Very high.
if = {
limit = { always = scope:diarch_syphon_treasury_sum_huge }
diarch_syphon_treasury_interaction_syphon_development_growth_effect = { LOSS = massive_development_progress_loss }
}
## High.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_large }
diarch_syphon_treasury_interaction_syphon_development_growth_effect = { LOSS = major_development_progress_loss }
}
## Medium.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_medium }
diarch_syphon_treasury_interaction_syphon_development_growth_effect = { LOSS = medium_development_progress_loss }
}
## Low.
else = {
diarch_syphon_treasury_interaction_syphon_development_growth_effect = { LOSS = minor_development_progress_loss }
}
}
# High stewardship characters syphon some control from various counties.
else_if = {
limit = { scope:actor.stewardship >= syphon_treasury_stewardship_high }
# Gold transfer was...
## Very high.
if = {
limit = { always = scope:diarch_syphon_treasury_sum_huge }
diarch_syphon_treasury_interaction_syphon_control_effect = { LOSS = monumental_county_control_loss }
}
## High.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_large }
diarch_syphon_treasury_interaction_syphon_control_effect = { LOSS = extreme_county_control_loss }
}
## Medium.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_medium }
diarch_syphon_treasury_interaction_syphon_control_effect = { LOSS = major_county_control_loss }
}
## Low.
else = {
diarch_syphon_treasury_interaction_syphon_control_effect = { LOSS = medium_county_control_loss }
}
}
# Medium stewardship characters syphon lots of control from one county.
else_if = {
limit = { scope:actor.stewardship >= syphon_treasury_stewardship_medium }
# Gold transfer was...
## Very high.
if = {
limit = { always = scope:diarch_syphon_treasury_sum_huge }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = {
NOT = { this = scope:recipient.capital_county }
}
alternative_limit = { always = yes }
change_county_control = monumental_county_control_loss
}
}
## High.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_large }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = {
NOT = { this = scope:recipient.capital_county }
}
alternative_limit = { always = yes }
change_county_control = extreme_county_control_loss
}
}
## Medium.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_medium }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = {
NOT = { this = scope:recipient.capital_county }
}
alternative_limit = { always = yes }
change_county_control = major_county_control_loss
}
}
## Low.
else = {
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = {
NOT = { this = scope:recipient.capital_county }
}
alternative_limit = { always = yes }
change_county_control = medium_county_control_loss
}
}
}
# Low stewardship characters apply county modifiers.
else = {
# Gold transfer was...
## Very high.
if = {
limit = { always = scope:diarch_syphon_treasury_sum_huge }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = { diarch_syphon_treasury_embezzlement_modifiers_trigger = no }
add_county_modifier = {
modifier = syphon_treasury_massive_sum_modifier
years = 5
}
}
}
## High.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_large }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = { diarch_syphon_treasury_embezzlement_modifiers_trigger = no }
add_county_modifier = {
modifier = syphon_treasury_large_sum_modifier
years = 5
}
}
}
## Medium.
else_if = {
limit = { always = scope:diarch_syphon_treasury_sum_medium }
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = { diarch_syphon_treasury_embezzlement_modifiers_trigger = no }
add_county_modifier = {
modifier = syphon_treasury_medium_sum_modifier
years = 5
}
}
}
## Low.
else = {
random_held_county = {
# Try to prefer against the capital, as that's more noticeable.
limit = { diarch_syphon_treasury_embezzlement_modifiers_trigger = no }
add_county_modifier = {
modifier = syphon_treasury_small_sum_modifier
years = 5
}
}
}
}
}
}
# Defeat! No gold, just strife & a crime opinion.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
# Malus for higher amounts.
modifier = {
add = 25
always = scope:diarch_syphon_treasury_sum_large
}
# Chungus malus for chungus higher amounts.
modifier = {
add = 100
always = scope:diarch_syphon_treasury_sum_huge
}
# You can always fail.
min = 20
desc = diarch_syphon_treasury_interaction.tt.failure.actor
send_interface_toast = {
type = event_toast_effect_bad
title = diarch_syphon_treasury_interaction.tt.failure.actor
left_icon = scope:recipient
show_as_tooltip = { diarch_syphon_treasury_interaction_caught_embezzling_effect = yes }
}
hidden_effect = {
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_neutral
title = diarch_syphon_treasury_interaction.tt.failure.recipient
left_icon = scope:actor
diarch_syphon_treasury_interaction_caught_embezzling_effect = yes
}
}
}
}
}
}
# Debug logging.
debug_log = debug_log.syphon_treasury.attempt_made
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 12
ai_potential = {
is_diarch = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
# Honest and generous characters never embezzle.
NOR = {
has_trait = honest
has_trait = generous
}
}
ai_will_do = {
# Embezzlement is serious, so you need actual reasons for it.
base = 0
# Additions.
## Weight for opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -1
}
## Weight for personality.
ai_value_modifier = {
ai_boldness = 0.25
ai_greed = 1
ai_honor = -0.5
}
## Flag Management.
### The AI never goes for a huge sum, that's just there to tempt the player.
### We prefer a large sum if we've got a massive skill disparity.
modifier = {
add = 100
scope:diarch_syphon_treasury_sum_large = yes
stewardship_diff = {
target = scope:recipient
value >= @ai_skill_diff_upper_threshold
}
}
### But a moderate sum does well if we're more evenly matched.
modifier = {
add = 50
scope:diarch_syphon_treasury_sum_medium = yes
stewardship_diff = {
target = scope:recipient
value < @ai_skill_diff_upper_threshold
}
stewardship_diff = {
target = scope:recipient
value >= @ai_skill_diff_lower_threshold
}
}
### Aaaand otherwise we'll accept a small amount.
modifier = {
add = 25
scope:diarch_syphon_treasury_sum_small = yes
stewardship_diff = {
target = scope:recipient
value < @ai_skill_diff_lower_threshold
}
}
## Less likely in tribal societies with less bookwork to hide theft in.
modifier = {
add = -50
scope:recipient = { government_has_flag = government_is_tribal }
}
## Debt is a great motivator for theft.
### Is slightly in debt.
modifier = {
add = 10
debt_level = 1
}
### Is one year in debt.
modifier = {
add = 25
debt_level = 2
}
### Is two years in debt.
modifier = {
add = 40
debt_level = 3
}
### Is three years in debt.
modifier = {
add = 60
debt_level = 4
}
### Is four years in debt.
modifier = {
add = 100
debt_level = 5
}
### Is over five years in debt.
modifier = {
add = 200
debt_level >= 6
}
## Certain traits can affect likelihood directly.
### It's intentional that these don't sync up value-wise with their opposite traits.
### Honest/generous excluded because they're hard locked out of the interaction for the AI.
### +++ Greedy.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = greedy
}
### ++ Deceitful.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = deceitful
}
### + Arbitrary.
modifier = {
add = diarch_ai_desire_plus_1_value
has_trait = arbitrary
}
### -- Just.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = just
}
## Skill considerations.
### Very low negative comparative stewardship.
modifier = {
add = -50
stewardship_diff = {
target = scope:recipient
value <= 10
}
# Filter out arrogant characters, who can't believe they suck.
NOT = { has_trait = arrogant }
}
### Low negative comparative stewardship.
modifier = {
add = -25
stewardship_diff = {
target = scope:recipient
value <= 5
}
# Filter out arrogant characters, who can't believe they suck.
NOT = { has_trait = arrogant }
}
### High positive comparative stewardship.
modifier = {
add = 25
stewardship_diff = {
target = scope:recipient
value >= 5
}
# Filter out humble characters, who give their liege too much credit.
NOT = { has_trait = humble }
}
### Very high positive comparative stewardship.
modifier = {
add = 50
stewardship_diff = {
target = scope:recipient
value >= 10
}
# Filter out humble characters, who give their liege too much credit.
NOT = { has_trait = humble }
}
# Factors.
## + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## We're happy to bully players here, since we're not taking their land.
}
}
# Diarch (actor) either tests diplomacy or spends prestige to give negative modifiers to the lands of a vassal of their liege (secondary recipient), who can't resist.
diarch_shift_privileges_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
icon = icon_shift_privileges
common_interaction = yes
ai_intermediary_maybe = yes
desc = diarch_shift_privileges_interaction_desc
popup_on_receive = yes
interface_priority = 285
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
}
# Make sure scope:recipient is suitable.
scope:recipient = {
# We only target vassals of the liege...
liege = scope:actor.liege
NOT = { this = scope:actor.liege }
# ... who are appropriately landed.
is_landed_or_landless_administrative = yes
scope:recipient.highest_held_title_tier >= tier_county
}
}
is_valid_showing_failures_only = {
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Diarch revocations require a claim.
custom_tooltip = {
text = diarch_shift_privileges_interaction.tt.no_affectable_counties
scope:recipient = {
any_held_county = { diarch_shift_privileges_valid_target_title_trigger = yes }
}
}
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_an_entrenched_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_shift_privileges_interaction }
}
# Must select something.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:diarch_shift_privileges_interaction_duel_diplomacy = yes
scope:diarch_shift_privileges_interaction_pay_prestige_partial = yes
scope:diarch_shift_privileges_interaction_pay_prestige_full = yes
}
}
}
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
cooldown = { months = 6 }
cooldown_against_recipient = { years = 3 }
# Attempt Methods
send_options_exclusive = yes
## Duel for it.
send_option = {
# You can always try to duel for it.
flag = diarch_shift_privileges_interaction_duel_diplomacy
}
## Pay partial prestige.
send_option = {
is_valid = {
scope:actor = {
prestige >= {
value = shift_privileges_interaction_target_discounted_cost_value
multiply = -1
}
}
}
flag = diarch_shift_privileges_interaction_pay_prestige_partial
}
## Pay full prestige.
send_option = {
is_valid = {
scope:actor = {
prestige >= {
value = shift_privileges_interaction_target_cost_value
multiply = -1
}
}
}
flag = diarch_shift_privileges_interaction_pay_prestige_full
}
on_send = {
# Did a landless diarch send this?
log_diarch_send_interaction_as_variable_effect = { INTERACTION = shift_privileges }
}
on_accept = {
scope:actor = {
# Resolution method.
## If we're duelling, then we duel.
if = {
limit = { scope:diarch_shift_privileges_interaction_duel_diplomacy = yes }
# Now: FIGHT! WITH WORDS!
duel = {
skill = diplomacy
target = scope:recipient
# Victory! Cash for you, negative modifier for your opponent.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = diarch_shift_privileges_interaction.tt.success
diarch_shift_privileges_interaction_apply_success_effect = yes
}
# Defeat! Into the loser's bin you go.
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = diarch_shift_privileges_interaction.tt.failure
diarch_shift_privileges_interaction_apply_fail_effect = yes
}
}
}
## Otherwise we can take an even gamble against a reduced prestige cost..
else_if = {
limit = { scope:diarch_shift_privileges_interaction_pay_prestige_partial = yes }
random_list = {
# Victory! A claim for you.
100 = {
desc = diarch_shift_privileges_interaction.tt.success
diarch_shift_privileges_interaction_apply_success_effect = yes
}
# Defeat! Into the loser's bin you go.
100 = {
desc = diarch_shift_privileges_interaction.tt.failure
diarch_shift_privileges_interaction_apply_fail_effect = yes
}
}
}
## Or pay the full price.
else = {
custom_tooltip = diarch_shift_privileges_interaction.tt.success
diarch_shift_privileges_interaction_apply_success_effect = yes
}
# Prestige costs.
## Point out the lack of cost.
if = {
limit = { scope:diarch_shift_privileges_interaction_duel_diplomacy = yes }
custom_tooltip = diarch_interaction_pay_prestige_none
}
## Point out the discount.
else_if = {
limit = { scope:diarch_shift_privileges_interaction_pay_prestige_partial = yes }
add_prestige = shift_privileges_interaction_target_discounted_cost_value
}
## Soz mate, yerr payin' full price.
else = { add_prestige = shift_privileges_interaction_target_cost_value }
}
# Debug logging.
debug_log = debug_log.shift_privileges.attempt_made
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = peer_vassals }
ai_frequency = 6
ai_potential = {
is_diarch = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_secondary_powers_base_value
# Additions.
## Weight for opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -1
}
## Weight for personality.
ai_value_modifier = {
ai_boldness = 0.25
ai_greed = 0.5
ai_honor = 0.5
}
## Flag Management.
### Duel for it if we're massively superior.
modifier = {
add = 100
scope:diarch_shift_privileges_interaction_duel_diplomacy = yes
diplomacy_diff = {
target = scope:recipient
value >= @ai_skill_diff_upper_threshold
}
}
### Else we'll try to pay full prestige, if we've got lots to spare.
modifier = {
add = 50
scope:diarch_shift_privileges_interaction_pay_prestige_full = yes
prestige >= {
value = shift_privileges_interaction_target_cost_value
multiply = @ai_prestige_bank_threshold
}
}
### Or else we'll chance it, if we can afford that + some slack.
modifier = {
add = 25
scope:diarch_shift_privileges_interaction_pay_prestige_partial = yes
prestige < {
value = shift_privileges_interaction_target_cost_value
multiply = @ai_prestige_bank_threshold
}
prestige >= {
value = shift_privileges_interaction_target_discounted_cost_value
multiply = @ai_prestige_bank_threshold
}
}
### Otherwise we'll risk a regular duel.
## Landless AI want to do this more.
modifier = {
add = 25
is_ruler = no
}
## AI who are in debt seek ways out of it.
modifier = {
add = 100
debt_level >= 0
}
## Certain traits make it either very likely or very unlikely.
### +++ Arbitrary.
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = arbitrary
}
### --- Just.
modifier = {
add = diarch_ai_desire_minus_3_value
has_trait = just
}
# Factors.
## + Do pick on people we hate.
modifier = {
factor = 1.5
should_prioritise_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## - Try not to pick on allies of our liege.
modifier = {
factor = 0.25
should_avoid_hostile_action_against_due_to_liege_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## x0 Don't pick on our friends or allies.
modifier = {
factor = 0
should_avoid_hostile_action_against_due_to_personal_relations_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
## x0 Don't pick on players unless they're of at least a decent size.
modifier = {
factor = 0
scope:recipient = {
is_ai = no
any_held_county = { count <= 3 }
}
}
### x0 Don't go into prestige debt!
modifier = {
factor = 0
prestige < 0
}
}
}
# Diarch (actor) requests use of a special CB from liege (recipient), allowing them to powerfully expand the empire's borders and harvest influence.
diarch_request_imperial_expedition_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
notification_text = DIARCH_REQUESTS_IMPERIAL_EXPEDITION
icon = invasion
interface_priority = 5
desc = diarch_request_imperial_expedition_interaction_desc
ai_maybe = yes
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
liege = { has_diarchy_parameter = unlock_diarch_requests_military_expedition_interaction }
}
# Same sub-realm only.
OR = {
scope:actor.liege = scope:recipient
scope:recipient = {
any_liege_or_above = { this = scope:actor.liege }
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_diarch_requests_military_expedition_interaction }
# And you have to have _some_ troops of your own.
custom_tooltip = {
text = diarch_request_imperial_expedition_interaction.tt.minimum_troop_count
scope:actor.max_military_strength >= request_imperial_expedition_minimum_troop_count_value
}
# _And_ you don't already have a charge.
custom_tooltip = {
text = diarch_request_imperial_expedition_interaction.tt.actor_already_has_charge
scope:actor = {
NOT = { has_variable = imperial_expedition_charged }
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
# Hefty cooldown on this guy, as you shouldn't be able to do these often.
cooldown_against_recipient = { years = 25 }
cost = {
influence = {
if = {
limit = { scope:influence_major = yes }
add = request_imperial_expedition_influence_stake_major_value
}
else_if = {
limit = { scope:influence_medium = yes }
add = request_imperial_expedition_influence_stake_medium_value
}
else_if = {
limit = { scope:influence_minor = yes }
add = request_imperial_expedition_influence_stake_minor_value
}
}
}
# How much influence do we want to outlay on this?
## A cheapy amount.
send_option = {
# Always valid.
flag = influence_minor
localization = diarch_request_imperial_expedition_interaction.tt.influence_minor_name
}
## A medium amount.
send_option = {
is_valid = { scope:actor.influence >= request_imperial_expedition_influence_stake_medium_value }
flag = influence_medium
localization = diarch_request_imperial_expedition_interaction.tt.influence_medium_name
}
## A large amount.
send_option = {
is_valid = { scope:actor.influence >= request_imperial_expedition_influence_stake_major_value }
flag = influence_major
localization = diarch_request_imperial_expedition_interaction.tt.influence_major_name
}
## Use a hook instead.
send_option = {
is_valid = {
scope:actor = { has_usable_hook = scope:recipient }
}
flag = hook
localization = GENERIC_SPEND_A_HOOK
}
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
on_auto_accept = {
# Fire the notification event telling scope:recipient what's been done.
scope:recipient = { trigger_event = diarchy.8003 }
}
on_accept = {
scope:actor = {
# Display effects in the interaction.
show_as_tooltip = { diarch_request_imperial_expedition_accepted_effect = yes }
# Fire the notification event.
trigger_event = diarchy.8001
}
}
on_decline = {
scope:actor = {
# Display effects in the interaction.
show_as_tooltip = { diarch_request_imperial_expedition_rejected_effect = yes }
# Fire the notification event.
trigger_event = diarchy.8002
}
}
auto_accept = {
scope:recipient = {
trigger_if = {
limit = { scope:hook = yes }
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
}
}
trigger_else_if = {
limit = { scope:influence_major = yes }
influence < request_imperial_expedition_influence_stake_major_value
}
trigger_else_if = {
limit = { scope:influence_medium = yes }
influence < request_imperial_expedition_influence_stake_medium_value
}
trigger_else_if = {
limit = { scope:influence_minor = yes }
influence < request_imperial_expedition_influence_stake_minor_value
}
trigger_else = { always = no }
}
}
ai_accept = {
base = -25
# Opinion Factor
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 1
desc = AI_OPINION_REASON
}
# Your level of influence.
## Impotent
modifier = {
add = -10
desc = AI_OPINION_INFLUENCE_LEVEL_IMPOTENT
scope:actor.influence_level = 0
}
## Influential
### Would be zero, so it wouldn't appear.
## Persuasive
modifier = {
add = 10
desc = AI_OPINION_INFLUENCE_LEVEL_PERSUASIVE
scope:actor.influence_level = 2
}
## Controlling
modifier = {
add = 20
desc = AI_OPINION_INFLUENCE_LEVEL_CONTROLLING
scope:actor.influence_level = 3
}
## Authoritative
modifier = {
add = 30
desc = AI_OPINION_INFLUENCE_LEVEL_AUTHORITATIVE
scope:actor.influence_level = 4
}
## Imperious
modifier = {
add = 40
desc = AI_OPINION_INFLUENCE_LEVEL_IMPERIOUS
scope:actor.influence_level = 5
}
# Traits.
## ---- Paranoid
modifier = {
add = -50
desc = ai_acceptance_trait_paranoid
scope:recipient = { has_trait = paranoid }
}
## --- Stubborn
modifier = {
add = -30
desc = ai_acceptance_trait_stubborn
scope:recipient = { has_trait = stubborn }
}
## --- Content
modifier = {
add = -30
desc = ai_acceptance_trait_content
scope:recipient = { has_trait = content }
}
## - Humble
modifier = {
add = -10
desc = ai_acceptance_trait_humble
scope:recipient = { has_trait = humble }
}
## + Arrogant
modifier = {
add = 10
desc = ai_acceptance_trait_arrogant
scope:recipient = { has_trait = arrogant }
}
## + Ambitious
modifier = {
add = 10
desc = ai_acceptance_trait_ambitious
scope:recipient = { has_trait = ambitious }
}
## ++ Trusting
modifier = {
add = 20
desc = ai_acceptance_trait_trusting
scope:recipient = { has_trait = trusting }
}
## ++ Fickle
modifier = {
add = 20
desc = ai_acceptance_trait_fickle
scope:recipient = { has_trait = fickle }
}
## ++ Lazy
modifier = {
add = 20
desc = ai_acceptance_trait_lazy
scope:recipient = { has_trait = lazy }
}
## +++ Craven
modifier = {
add = 30
desc = ai_acceptance_trait_craven
scope:recipient = { has_trait = craven }
}
# Factor for personality.
ai_value_modifier = {
who = scope:recipient
# The meeker they are, the more they'll go along with your wishes.
ai_boldness = {
if = {
limit = {
scope:recipient = {
NOT = { ai_boldness = 0 }
}
}
value = -1
}
}
# And the lazier.
ai_energy = {
if = {
limit = {
scope:recipient = { ai_energy > 0 }
}
value = 0.5
}
}
}
}
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 24
ai_potential = {
is_diarch = yes
liege = { has_diarchy_active_parameter = unlock_diarch_requests_military_expedition_interaction }
NOR = {
has_trait = craven
has_trait = lazy
has_trait = content
}
}
ai_will_do = {
base = -50
# Personality.
ai_value_modifier = {
ai_energy = 2
ai_boldness = 1
ai_greed = 1
}
# Traits.
## Brave
modifier = {
add = 25
has_trait = brave
}
## Ambitious
modifier = {
add = 50
has_trait = ambitious
}
## Arrogant
modifier = {
add = 25
has_trait = arrogant
}
## Loyal & Disloyal (same result, different motivations)
modifier = {
add = 25
OR = {
has_trait = loyal
has_trait = disloyal
}
}
## Diligent
modifier = {
add = 25
has_trait = diligent
}
## We've already filtered out craven, lazy, & content by this point.
# Military.
## For every thousand troops we can put in ourselves, make us more likely to ask.
modifier = {
add = {
value = scope:actor.max_military_strength
divide = 100
floor = yes
}
always = yes
}
# Flag Management.
## Make sure the AI uses hooks for this as it's % based
modifier = {
add = 1
scope:hook = yes
}
## Otherwise, try to spend the most influence possible whenever we can.
modifier = {
add = 3
scope:influence_minor = yes
}
modifier = {
add = 2
scope:influence_medium = yes
}
modifier = {
add = 1
scope:influence_major = yes
}
}
}
# Diarch (actor) requests a kingdom governor title from liege (recipient).
diarch_demand_despotate_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
notification_text = DIARCH_DEMANDS_DESPOTATE
icon = icon_found_despotate
interface_priority = 15
desc = diarch_demand_despotate_interaction_desc
target_type = title
target_filter = secondary_recipient_de_jure_titles
can_be_picked_title = {
scope:target = { valid_kingdom_for_diarch_to_demand_as_despotate_trigger = yes }
}
has_valid_target_showing_failures_only = {
# Only show kingdoms.
scope:target.tier = tier_kingdom
# Don't show the empire's capital kingdom.
NOT = {
scope:recipient.capital_county = { target_is_de_jure_liege_or_above = scope:target }
}
}
# We do this via redirects because recipient_de_jure_titles did not turn up for work today.
redirect = {
scope:recipient = { save_scope_as = secondary_recipient }
}
ai_maybe = yes
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
liege = { has_diarchy_parameter = unlock_diarch_demand_kingdom_interaction }
}
# Same sub-realm only.
OR = {
scope:actor.liege = scope:recipient
scope:recipient = {
any_liege_or_above = { this = scope:actor.liege }
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_diarch_demand_kingdom_interaction }
# You do not already have a kingdom tier title
custom_tooltip = {
text = diarch_demand_despotate_interaction.tt.already_have_high_titles
scope:actor.highest_held_title_tier < tier_kingdom
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
# Hefty cooldown on this guy, as you shouldn't be able to pester about this often.
cooldown_against_recipient = { years = 25 }
cost = {
influence = {
if = {
limit = { scope:influence_major = yes }
add = diarch_demand_despotate_interaction_stake_major_value
}
else_if = {
limit = { scope:influence_medium = yes }
add = diarch_demand_despotate_interaction_stake_medium_value
}
else_if = {
limit = { scope:influence_minor = yes }
add = diarch_demand_despotate_interaction_stake_minor_value
}
}
}
# How much influence do we want to outlay on this?
## A cheapy amount.
send_option = {
# Always valid.
flag = influence_minor
localization = diarch_demand_despotate_interaction.tt.influence_minor_name
}
## A medium amount.
send_option = {
is_valid = { scope:actor.influence >= diarch_demand_despotate_interaction_stake_medium_value }
flag = influence_medium
localization = diarch_demand_despotate_interaction.tt.influence_medium_name
}
## A large amount.
send_option = {
is_valid = { scope:actor.influence >= diarch_demand_despotate_interaction_stake_major_value }
flag = influence_major
localization = diarch_demand_despotate_interaction.tt.influence_major_name
}
## Use a hook instead.
send_option = {
is_valid = {
scope:actor = { has_usable_hook = scope:recipient }
}
flag = hook
localization = GENERIC_SPEND_A_HOOK
}
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
on_auto_accept = {
# Fire the notification event telling scope:recipient what's been done.
scope:recipient = { trigger_event = diarchy.8033 }
}
on_accept = {
# Notify the player of how to force their liege's hand.
if = {
limit = {
scope:influence_major = yes
scope:recipient.influence >= diarch_demand_despotate_interaction_stake_to_raise_major_inverted_value
}
custom_tooltip = diarch_demand_despotate_interaction_stake_to_raise_major_value.tt.liege_can_refuse
}
else_if = {
limit = {
scope:influence_medium = yes
scope:recipient.influence >= diarch_demand_despotate_interaction_stake_to_raise_medium_inverted_value
}
custom_tooltip = diarch_demand_despotate_interaction_stake_to_raise_medium_value.tt.liege_can_refuse
}
else_if = {
limit = {
scope:influence_minor = yes
scope:recipient.influence >= diarch_demand_despotate_interaction_stake_to_raise_minor_inverted_value
}
custom_tooltip = diarch_demand_despotate_interaction_stake_to_raise_minor_value.tt.liege_can_refuse
}
scope:actor = {
# Display effects in the interaction.
show_as_tooltip = { diarch_demand_despotate_interaction_accepted_effect = yes }
# Fire the notification event.
trigger_event = diarchy.8031
}
}
on_decline = {
scope:actor = {
# Display effects in the interaction.
show_as_tooltip = { diarch_demand_despotate_interaction_rejected_effect = yes }
# Fire the notification event.
trigger_event = diarchy.8032
}
}
auto_accept = {
scope:recipient = {
trigger_if = {
limit = { scope:hook = yes }
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
}
}
trigger_else_if = {
limit = { scope:influence_major = yes }
influence < diarch_demand_despotate_interaction_stake_to_raise_major_inverted_value
}
trigger_else_if = {
limit = { scope:influence_medium = yes }
influence < diarch_demand_despotate_interaction_stake_to_raise_medium_inverted_value
}
trigger_else_if = {
limit = { scope:influence_minor = yes }
influence < diarch_demand_despotate_interaction_stake_to_raise_minor_inverted_value
}
trigger_else = { always = no }
}
}
ai_accept = {
base = -50
# Opinion Factor
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 1
desc = AI_OPINION_REASON
}
# Your level of influence.
## Impotent
modifier = {
add = -10
desc = AI_OPINION_INFLUENCE_LEVEL_IMPOTENT
scope:actor.influence_level = 0
}
## Influential
### Would be zero, so it wouldn't appear.
## Persuasive
modifier = {
add = 10
desc = AI_OPINION_INFLUENCE_LEVEL_PERSUASIVE
scope:actor.influence_level = 2
}
## Controlling
modifier = {
add = 20
desc = AI_OPINION_INFLUENCE_LEVEL_CONTROLLING
scope:actor.influence_level = 3
}
## Authoritative
modifier = {
add = 30
desc = AI_OPINION_INFLUENCE_LEVEL_AUTHORITATIVE
scope:actor.influence_level = 4
}
## Imperious
modifier = {
add = 40
desc = AI_OPINION_INFLUENCE_LEVEL_IMPERIOUS
scope:actor.influence_level = 5
}
# Traits.
## ---- Paranoid
modifier = {
add = -50
desc = ai_acceptance_trait_paranoid
scope:recipient = { has_trait = paranoid }
}
## --- Stubborn
modifier = {
add = -30
desc = ai_acceptance_trait_stubborn
scope:recipient = { has_trait = stubborn }
}
## --- Greedy
modifier = {
add = -30
desc = ai_acceptance_trait_greedy
scope:recipient = { has_trait = greedy }
}
## -- Arrogant
modifier = {
add = -20
desc = ai_acceptance_trait_arrogant
scope:recipient = { has_trait = arrogant }
}
## ++ Humble
modifier = {
add = 20
desc = ai_acceptance_trait_humble
scope:recipient = { has_trait = humble }
}
## ++ Trusting
modifier = {
add = 20
desc = ai_acceptance_trait_trusting
scope:recipient = { has_trait = trusting }
}
## ++ Fickle
modifier = {
add = 20
desc = ai_acceptance_trait_fickle
scope:recipient = { has_trait = fickle }
}
## ++ Lazy
modifier = {
add = 20
desc = ai_acceptance_trait_lazy
scope:recipient = { has_trait = lazy }
}
## ++ Generous
modifier = {
add = 20
desc = ai_acceptance_trait_generous
scope:recipient = { has_trait = generous }
}
# Factor for personality.
ai_value_modifier = {
who = scope:recipient
# The meeker they are, the more they'll go along with your wishes.
ai_boldness = {
if = {
limit = {
scope:recipient = {
NOT = { ai_boldness = 0 }
}
}
value = -1
}
}
# And the lazier.
ai_energy = {
if = {
limit = {
scope:recipient = { ai_energy > 0 }
}
value = 0.5
}
}
}
}
# AI
ai_set_target = {
scope:recipient = {
# Grab our empires.
every_held_title = {
limit = { tier >= tier_empire }
add_to_list = empires_list
}
# Then from that, formulate our kingdoms.
every_in_list = {
list = empires_list
every_in_de_jure_hierarchy = {
limit = {
tier = tier_kingdom
valid_kingdom_for_diarch_to_demand_as_despotate_trigger = yes
}
continue = { tier >= tier_kingdom }
add_to_list = kingdoms_list
}
}
# Now pick our best shot.
ordered_in_list = {
list = kingdoms_list
order_by = {
# Tell the AI to grab its own kingdom first of all.
if = {
limit = { this = scope:actor.capital_county.kingdom }
add = 1000
}
# Otherwise, go for the biggest within the empire.
else = {
every_de_jure_county_holder = {
limit = { top_liege = scope:recipient }
add = 1
}
}
}
save_scope_as = target
}
}
}
ai_targets = { ai_recipients = liege }
ai_frequency = 24
ai_potential = {
is_diarch = yes
liege = { has_diarchy_active_parameter = unlock_diarch_demand_kingdom_interaction }
NOR = {
has_trait = humble
has_trait = content
}
# Loyal diarchs don't ask for what their liege could give freely.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
base = 25
# Personality.
ai_value_modifier = {
ai_greed = 1
ai_boldness = 1
ai_energy = 0.25
}
# Opinion.
## The more we like our emperor, the less likely we are to want to interfere in their planned setup.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -0.25
}
# Traits.
## +++ Ambitious.
modifier = {
add = 50
has_trait = ambitious
}
## +++ Arrogant.
modifier = {
add = 50
has_trait = arrogant
}
## ++ Greedy.
modifier = {
add = 25
has_trait = greedy
}
## ++ Diligent.
modifier = {
add = 25
has_trait = diligent
}
## -- Generous.
modifier = {
add = -25
has_trait = generous
}
## --- Lazy.
modifier = {
add = -50
has_trait = lazy
}
## Humble & Content have both been pre-filtered out.
# Flag Management.
## Make sure the AI uses hooks for this as it's % based
modifier = {
add = 4
scope:hook = yes
}
## Otherwise, try to spend the most influence possible whenever we can.
modifier = {
add = 3
scope:influence_minor = yes
}
modifier = {
add = 2
scope:influence_medium = yes
}
modifier = {
add = 1
scope:influence_major = yes
}
}
}
##################################################
# DIARCH COUP LIEGE INTERACTIONS
diarch_coup_liege_interaction = {
category = interaction_category_diarch
diarch_interaction = yes
icon = icon_scheme_claim_throne
interface_priority = 50
pre_answer_no_breakdown_key = diarch_coup_liege_interaction_pre_answer_no_breakdown_key
pre_answer_yes_breakdown_key = diarch_coup_liege_interaction_pre_answer_yes_breakdown_key
desc = diarch_coup_liege_interaction_desc
# First, grab every other powerful vassal of your liege & plonk them in a list.
populate_recipient_list = {
scope:actor.liege = {
every_powerful_vassal = {
limit = {
NOT = { this = scope:actor }
}
add_to_list = characters
}
every_powerful_family = {
limit = {
NOR = {
house_head = scope:actor
house_head = scope:recipient
}
}
house_head = { add_to_list = characters }
}
}
}
redirect = {
# Turn the old scope:recipient into the target.
if = {
limit = {
NOR = {
scope:recipient = scope:actor
scope:recipient = scope:actor.liege
}
}
scope:recipient = { save_scope_as = secondary_recipient }
}
# Always make sure we're targeting your liege as the recipient for UX consistency.
scope:actor.liege = { save_scope_as = recipient }
}
interface_priority = 20
is_shown = {
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
OR = {
AND = {
exists = liege
is_diarch_of_target = liege
}
is_designated_diarch = yes
}
}
# Valid on vassals of your liege or your liege themselves.
## More complex triggers don't generally work because redirect brings the interaction back to targeting the liege as scope:recipient, so we're left with this.
### Don't try to improve it, it's not worth it, but if you _do_, then test your changes thoroughly.
#### When this breaks (which it does easily), it tends to mean the interaction shows up as valid against _every_ other character in diplomatic range.
OR = {
scope:recipient = scope:actor.liege
scope:secondary_recipient.liege ?= scope:actor.liege
}
}
is_valid_showing_failures_only = {
# Diarch must be able to act.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
# Loyalty hooks, per the name, will tend to block this.
custom_tooltip = {
text = diarch_coup_liege_interaction.tt.action_blocked_by_loyalty_hook
NOT = {
diarch_loyalty_due_to_hook_trigger = {
LIEGE = scope:recipient
DIARCH = scope:actor
}
}
}
# They can't already be in the list.
custom_tooltip = {
text = diarch_coup_liege_interaction.tt.secondary_recipient_is_already_in_list
NOT = {
scope:actor = {
any_in_list = {
variable = coup_pv_supporters_list
this = scope:secondary_recipient
}
}
}
}
# Must be in an actual diarchy — we show most interactions greyed out for designated diarchs.
custom_tooltip = {
text = diarch_interactions.tt.you_must_be_in_an_entrenched_regency_to_access
scope:actor = { is_diarch = yes }
}
# And, relatedly, there's some checks that we don't show you unless you *are* already in a diarchy.
trigger_if = {
limit = {
scope:actor = { is_diarch = yes }
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege ?= { has_diarchy_active_parameter = regents_can_try_to_overthrow_present_lieges }
}
trigger_if = {
limit = { exists = scope:secondary_recipient }
# Must be available.
## So no kids.
scope:secondary_recipient = { is_adult = yes }
## & no one in prison.
scope:secondary_recipient = { is_imprisoned = no }
# Plus, currently, humans can't be part of these plots.
scope:secondary_recipient = { is_ai = yes }
}
# Must select something — tooltips'll knacker otherwise + just for consistency.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:promise_nothing = yes
scope:promise_hook_weak = yes
scope:promise_hook_strong = yes
scope:promise_gold_medium = yes
scope:promise_gold_large = yes
}
}
}
# Cannot be at war with your liege.
NOT = {
scope:actor = { is_at_war_with = scope:actor.liege }
}
}
can_send = {
# We check this here to make the interaction generally findable, so you can get at the list easily, but prevent you from inviting randos to the coup.
## It's actually technically harmless - they won't help but don't get their payout if they're not powerful when the coup hits.
trigger_if = {
limit = {
scope:recipient = { government_has_flag = government_is_administrative }
}
scope:secondary_recipient.house = { is_powerful_family = yes }
}
trigger_else = {
scope:secondary_recipient = { is_powerful_vassal = yes }
}
}
# Promise bugger all.
send_option = {
flag = promise_nothing
localization = PROMISE_NOTHING
}
# Promise hook.
send_option = {
is_valid = {
# Can't offer a hook if they've already got any type of hook on you.
NOT = {
scope:secondary_recipient ?= { has_hook = scope:actor }
}
}
flag = promise_hook_weak
localization = PROMISE_HOOK_WEAK
}
# Promise strong hook.
send_option = {
is_valid = {
# Can't offer a strong hook if they've already got a strong hook on you.
NOT = {
scope:secondary_recipient ?= { has_strong_hook = scope:actor }
}
}
flag = promise_hook_strong
localization = PROMISE_HOOK_STRONG
}
# Promise gold.
send_option = {
flag = promise_gold_medium
localization = PROMISE_GOLD_MEDIUM
}
# Promise piles of gold.
send_option = {
flag = promise_gold_large
localization = PROMISE_GOLD_LARGE
}
on_accept = {
if = {
limit = { exists = scope:secondary_recipient }
scope:actor = {
# Scope:secondary_recipient joins your conspiracy.
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.joins_conspiracy
## Send a notification just for a bit of extra feedback.
send_interface_toast = {
type = event_toast_effect_good
title = diarch_coup_liege_interaction.tt.secondary_recipient.joins_conspiracy
left_icon = scope:secondary_recipient
}
# HerHis reward is collected if you succeed.
if = {
limit = { scope:promise_nothing = no }
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.reward
}
# Certain scope:secondary_recipients may betray their liege in the throne room itself.
## Chancellors in diplo coups.
if = {
limit = { scope:secondary_recipient ?= scope:recipient.cp:councillor_chancellor }
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.chancellor_sabotage
}
## Spymasters in intrigue coups.
if = {
limit = { scope:secondary_recipient ?= scope:recipient.cp:councillor_spymaster }
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.spymaster_sabotage
}
## Personal Champions in prowess coups.
if = {
limit = {
scope:secondary_recipient = { has_court_position = champion_court_position }
}
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.champion_sabotage
# Yes, there are other candidates, but we're not tooltipping every conceivable case. Rulers are gonna have supporters.
custom_tooltip = diarch_coup_liege_interaction.tt.secondary_recipient.champion_sabotage.others
}
# Right, actually record them.
## Including in the variable.
add_to_variable_list = {
name = coup_pv_supporters_list
target = scope:secondary_recipient
}
## And their promised payment, if anything.
### Weak hooks.
if = {
limit = { scope:promise_hook_weak = yes }
add_to_variable_list = {
name = coup_promise_list_weak_hook
target = scope:secondary_recipient
}
}
### Strong hooks.
else_if = {
limit = { scope:promise_hook_strong = yes }
add_to_variable_list = {
name = coup_promise_list_strong_hook
target = scope:secondary_recipient
}
}
### Cash.
else_if = {
limit = { scope:promise_gold_medium = yes }
add_to_variable_list = {
name = coup_promise_list_gold
target = scope:secondary_recipient
}
}
### Big Cash.
else_if = {
limit = { scope:promise_gold_large = yes }
add_to_variable_list = {
name = coup_promise_list_big_gold
target = scope:secondary_recipient
}
}
}
}
}
# Disguise the interaction from players.
ai_min_reply_days = 0
ai_max_reply_days = 0
ai_accept = {
# Base reluctance to commit to a risky, treasonous plan.
base = -50
# Opinion.
## Of scope:actor.
opinion_modifier = {
who = scope:secondary_recipient
opinion_target = scope:actor
multiplier = 1
}
## Of scope:recipient.
opinion_modifier = {
who = scope:secondary_recipient
opinion_target = scope:recipient
multiplier = -0.5
}
# Personality.
## Values.
ai_value_modifier = {
who = scope:secondary_recipient
ai_honor = -1
ai_boldness = 0.25
}
## Traits.
### +++ Disloyal.
modifier = {
add = diarch_ai_desire_plus_3_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.disloyal
scope:secondary_recipient = { has_trait = disloyal }
}
### +++ Ambitious.
modifier = {
add = diarch_ai_desire_plus_3_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.ambitious
scope:secondary_recipient = { has_trait = ambitious }
}
### ++ Arbitrary.
modifier = {
add = diarch_ai_desire_plus_2_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.arbitrary
scope:secondary_recipient = { has_trait = arbitrary }
}
### + Fickle.
modifier = {
add = diarch_ai_desire_plus_1_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.fickle
scope:secondary_recipient = { has_trait = fickle }
}
### - Stubborn.
modifier = {
add = diarch_ai_desire_minus_1_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.stubborn
scope:secondary_recipient = { has_trait = stubborn }
}
### -- Just.
modifier = {
add = diarch_ai_desire_minus_2_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.just
scope:secondary_recipient = { has_trait = just }
}
### --- Content.
modifier = {
add = diarch_ai_desire_minus_3_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.content
scope:secondary_recipient = { has_trait = content }
}
### --- Loyal.
modifier = {
add = diarch_ai_desire_minus_3_value
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook.tt.has_trait.loyal
scope:secondary_recipient = { has_trait = loyal }
}
# Hooks.
## Weak hooks are happy to have you in power.
modifier = {
add = 25
scope:secondary_recipient = { has_weak_hook = scope:actor }
}
## Strong hooks are *very* happy to have you in power.
modifier = {
add = 75
scope:secondary_recipient = { has_strong_hook = scope:actor }
}
## And conversely, don't want you to coup scope:recipient if they've already got a strong hook on them.
modifier = {
add = -100
scope:secondary_recipient = { has_strong_hook = scope:recipient }
}
## Loyalty hooks stop the AI signing up.
modifier = {
add = -1000
desc = diarch_coup_liege_interaction.tt.liege_has_loyalty_hook
diarch_loyalty_due_to_hook_trigger = {
LIEGE = scope:recipient
DIARCH = scope:secondary_recipient
}
}
# Various.
## Scope:secondary_recipient generally doesn't want to betray an ally.
modifier = {
add = {
value = -100
# Reduce the malus a little if also allied to scope:actor.
if = {
limit = {
scope:secondary_recipient = { is_allied_to = scope:actor }
}
add = 50
}
}
scope:secondary_recipient = { is_allied_to = scope:recipient }
}
## Heirs don't generally want to betray scope:recipient, as they'll lose out.
modifier = {
add = -100
desc = diarch_coup_liege_interaction.tt.heir_will_not_side_against_benefactor
scope:recipient = {
any_heir = { this = scope:secondary_recipient }
}
}
# Promises.
## Weak hook.
modifier = {
add = {
value = 25
# Multiply this...
## ... down for folks who wouldn't care...
if = {
limit = { has_trait = honest }
multiply = 0.5
}
## ... & and up for those who would.
if = {
limit = { has_trait = deceitful }
multiply = 2
}
}
desc = diarch_coup_liege_interaction.tt.wants_hook
scope:promise_hook_weak = yes
}
## Strong hook.
modifier = {
add = {
value = 50
# Multiply this...
## ... down for folks who wouldn't care...
if = {
limit = { has_trait = honest }
multiply = 0.5
}
## ... & and up for those who would.
if = {
limit = { has_trait = deceitful }
multiply = 2
}
}
desc = diarch_coup_liege_interaction.tt.wants_strong_hook
scope:promise_hook_strong = yes
}
## Gold.
modifier = {
add = {
value = 25
# Multiply this...
## ... down for folks who wouldn't care...
if = {
limit = { has_trait = generous }
multiply = 0.5
}
## ... & and up for those who would.
if = {
limit = { has_trait = greedy }
multiply = 2
}
}
desc = diarch_coup_liege_interaction.tt.wants_gold
scope:promise_gold_medium = yes
}
## Lotsa gold.
modifier = {
add = {
value = 50
# Multiply this...
## ... down for folks who wouldn't care...
if = {
limit = { has_trait = generous }
multiply = 0.5
}
## ... & and up for those who would.
if = {
limit = { has_trait = greedy }
multiply = 2
}
}
desc = diarch_coup_liege_interaction.tt.wants_strong_gold
scope:promise_gold_large = yes
}
}
# AI
## The AI doesn't use this interaction automatically - they try it manually upon hitting the required threshold.
}
##################################################
# LIEGE ON DIARCH POWERS
# Liege (actor) transfers vizier's (recipient's) extravagance modifiers into their own gold.
mulct_vizier_interaction = {
category = interaction_category_diarch
common_interaction = yes
icon = icon_gold
desc = mulct_vizier_interaction_desc
is_shown = {
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
diarch ?= scope:recipient
# Plus only on viziers.
has_diarchy_active_parameter = unlock_mulct_vizier_interaction
}
}
is_valid_showing_failures_only = {
scope:actor = {
# Some basic checks.
is_available_adult = yes
# Shouldn't happen, but just in case.
NOT = { is_at_war_with = scope:recipient }
}
# Must select something.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:mulct_vizier_interaction_minimal = yes
scope:mulct_vizier_interaction_minor = yes
scope:mulct_vizier_interaction_medium = yes
scope:mulct_vizier_interaction_major = yes
scope:mulct_vizier_interaction_massive = yes
}
}
}
}
# Don't squeeze them too often.
cooldown = { years = 10 }
# Attempt Methods
send_options_exclusive = yes
## Minimal.
### Always show this'un.
send_option = { flag = mulct_vizier_interaction_minimal }
## Minor.
send_option = { flag = mulct_vizier_interaction_minor }
## Medium.
send_option = { flag = mulct_vizier_interaction_medium }
## Major.
send_option = { flag = mulct_vizier_interaction_major }
## Massive.
send_option = { flag = mulct_vizier_interaction_massive }
can_send = {
trigger_if = {
limit = { scope:mulct_vizier_interaction_minor = yes }
custom_tooltip = {
text = mulct_vizier_interaction.extravagances_required.t1
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t1_treasure_modifier
has_character_modifier = vizier_extravagance_t1_activities_modifier
has_character_modifier = vizier_extravagance_t1_property_modifier
has_character_modifier = vizier_extravagance_t1_charity_modifier
}
}
}
custom_tooltip = {
text = mulct_vizier_interaction.scales_too_swung.tt
scope:actor.vizier_mulct_swing_check_value >= vizier_mulct_swing_gain_minor_value
}
}
trigger_if = {
limit = { scope:mulct_vizier_interaction_medium = yes }
custom_tooltip = {
text = mulct_vizier_interaction.extravagances_required.t2
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t2_treasure_modifier
has_character_modifier = vizier_extravagance_t2_activities_modifier
has_character_modifier = vizier_extravagance_t2_property_modifier
has_character_modifier = vizier_extravagance_t2_charity_modifier
}
}
}
custom_tooltip = {
text = mulct_vizier_interaction.scales_too_swung.tt
scope:actor.vizier_mulct_swing_check_value >= vizier_mulct_swing_gain_medium_value
}
}
trigger_if = {
limit = { scope:mulct_vizier_interaction_major = yes }
custom_tooltip = {
text = mulct_vizier_interaction.extravagances_required.t3
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t3_treasure_modifier
has_character_modifier = vizier_extravagance_t3_activities_modifier
has_character_modifier = vizier_extravagance_t3_property_modifier
has_character_modifier = vizier_extravagance_t3_charity_modifier
}
}
}
custom_tooltip = {
text = mulct_vizier_interaction.scales_too_swung.tt
scope:actor.vizier_mulct_swing_check_value >= vizier_mulct_swing_gain_major_value
}
}
trigger_if = {
limit = { scope:mulct_vizier_interaction_massive = yes }
custom_tooltip = {
text = mulct_vizier_interaction.extravagances_required.t4
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t4_treasure_modifier
has_character_modifier = vizier_extravagance_t4_activities_modifier
has_character_modifier = vizier_extravagance_t4_property_modifier
has_character_modifier = vizier_extravagance_t4_charity_modifier
}
}
}
custom_tooltip = {
text = mulct_vizier_interaction.scales_too_swung.tt
scope:actor.vizier_mulct_swing_check_value >= vizier_mulct_swing_gain_massive_value
}
}
}
on_accept = {
# Sort the gold transfer.
mulct_vizier_for_cash_effect = { VIZIER = scope:recipient }
scope:recipient = {
# How angry is scope:recipient?
if = {
limit = { scope:mulct_vizier_interaction_minimal = yes }
mulct_vizier_for_cash_opinion_reaction_effect = { MULT = 1 }
}
if = {
limit = { scope:mulct_vizier_interaction_minor = yes }
mulct_vizier_for_cash_opinion_reaction_effect = { MULT = 2 }
}
if = {
limit = { scope:mulct_vizier_interaction_medium = yes }
mulct_vizier_for_cash_opinion_reaction_effect = { MULT = 3 }
}
if = {
limit = { scope:mulct_vizier_interaction_major = yes }
mulct_vizier_for_cash_opinion_reaction_effect = { MULT = 4 }
}
if = {
limit = { scope:mulct_vizier_interaction_massive = yes }
mulct_vizier_for_cash_opinion_reaction_effect = { MULT = 5 }
}
# How much stress is this causing them?
stress_impact = {
ambitious = major_stress_impact_loss
arrogant = medium_stress_impact_loss
generous = minor_stress_impact_loss
greedy = major_stress_impact_gain
}
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_vizmulct_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_vizmulct_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_vizmulct_accept_recipient_list }
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = diarch }
ai_frequency = 120
ai_potential = {
has_active_diarchy = yes
has_diarchy_parameter = unlock_mulct_vizier_interaction
}
ai_will_do = {
# You generally want to do this if you can.
base = 100
# Circumstances.
## Are we in debt?
modifier = {
add = 100
gold <= -1
}
## Are we at war?
modifier = {
add = 100
is_at_war = yes
}
# Vizier Extravagances.
## Are they in the upper tiers?
modifier = {
add = 50
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t3_treasure_modifier
has_character_modifier = vizier_extravagance_t3_activities_modifier
has_character_modifier = vizier_extravagance_t3_property_modifier
has_character_modifier = vizier_extravagance_t3_charity_modifier
}
}
}
## Are they in the uppermost tier?
modifier = {
add = 25
scope:recipient = {
OR = {
has_character_modifier = vizier_extravagance_t4_treasure_modifier
has_character_modifier = vizier_extravagance_t4_activities_modifier
has_character_modifier = vizier_extravagance_t4_property_modifier
has_character_modifier = vizier_extravagance_t4_charity_modifier
}
}
}
# Traits.
## Greedy characters'll do it whenever they can.
modifier = {
add = 50
has_trait = greedy
}
## Generous characters'll only do it occasionally.
modifier = {
add = -50
has_trait = generous
}
# Send Option Usage.
## These teach the AI how to use the send options.
## These are linear; basically, prefer the largest number you're valid for (since the can_send'll block whatever you can't mulct).
modifier = {
add = 1
scope:mulct_vizier_interaction_minimal = yes
}
modifier = {
add = 2
scope:mulct_vizier_interaction_minor = yes
}
modifier = {
add = 3
scope:mulct_vizier_interaction_medium = yes
}
modifier = {
add = 4
scope:mulct_vizier_interaction_major = yes
}
modifier = {
add = 5
scope:mulct_vizier_interaction_massive = yes
}
}
}
##################################################
# BOTH-WAYS POWERS
# Diarch or liege target their opposite number and inflict negative realm opinion equivalent to the multiplied difference between intrigue or diplomacy in exchange for influence.
scapegoat_counterpart_interaction = {
category = interaction_category_diarch
icon = icon_scheme_slander
desc = scapegoat_counterpart_interaction_desc
interface_priority = 25
is_shown = {
# You must be one of the partners in a diarchy.
is_in_scapegoating_diarchy_visibility_trigger = { PARAMETER_TYPE = has_diarchy_parameter }
}
is_valid_showing_failures_only = {
# Free adults only: you can't issue this type of decree from prison, and it wouldn't be fair to stop you from slandering a child but let a child slander you.
scope:actor = {
is_imprisoned = no
is_adult = yes
}
# And you can't blame a literal child.
scope:recipient = { is_adult = yes }
# Nor can you blame the opposing party if you're a deactivated diarch.
trigger_if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
}
custom_tooltip = {
text = scapegoat_counterpart_interaction.tt.skill_requirements
OR = {
scope:actor.diplomacy > scope:recipient.diplomacy
scope:actor.intrigue > scope:recipient.intrigue
}
}
is_in_scapegoating_diarchy_visibility_trigger = { PARAMETER_TYPE = has_diarchy_active_parameter }
# Cannot be at war with each other.
NOT = {
scope:actor = { is_at_war_with = scope:recipient }
}
}
cooldown = { years = 3 }
cost = {
# Non-ruler diarchs have all the time to do this the slow way.
prestige = {
if = {
limit = {
scope:actor = { is_ruler = yes }
}
value = medium_prestige_value
}
}
}
# Diplomacy
## Small amount
send_option = {
is_valid = {
custom_tooltip = {
text = scapegoat_counterpart_interaction.diplomacy_small.is_valid
scope:actor.diplomacy > scope:recipient.diplomacy
}
}
flag = diplomacy_small
localization = scapegoat_counterpart_interaction.diplomacy_small.t
}
## Large amount
send_option = {
is_valid = {
custom_tooltip = {
text = scapegoat_counterpart_interaction.diplomacy_large.is_valid
scope:actor.diplomacy > scope:recipient.diplomacy
}
}
flag = diplomacy_large
localization = scapegoat_counterpart_interaction.diplomacy_large.t
}
# Intrigue
## Small amount
send_option = {
is_valid = {
custom_tooltip = {
text = scapegoat_counterpart_interaction.intrigue_small.is_valid
scope:actor.intrigue > scope:recipient.intrigue
}
}
flag = intrigue_small
localization = scapegoat_counterpart_interaction.intrigue_small.t
}
## Large amount
send_option = {
is_valid = {
custom_tooltip = {
text = scapegoat_counterpart_interaction.intrigue_large.is_valid
scope:actor.intrigue > scope:recipient.intrigue
}
}
flag = intrigue_large
localization = scapegoat_counterpart_interaction.intrigue_large.t
}
on_accept = {
scope:recipient = {
# Send out our effects for the diarch.
if = {
limit = { is_diarch_of_target = scope:actor }
trigger_event = diarchy.8041
every_player = {
limit = {
top_liege = scope:actor.top_liege
NOR = {
this = scope:actor
this = scope:recipient
}
}
trigger_event = diarchy.8041
}
scapegoat_counterpart_interaction_process_results_effect = {
REALM_OPINION_ACTOR = add_tyranny
REALM_OPINION_RECIPIENT = change_strife_opinion
}
}
# And our effects for the liege.
else = {
trigger_event = diarchy.8042
every_player = {
limit = {
top_liege = scope:actor.top_liege
NOR = {
this = scope:actor
this = scope:recipient
}
}
trigger_event = diarchy.8042
}
scapegoat_counterpart_interaction_process_results_effect = {
REALM_OPINION_ACTOR = change_strife_opinion
REALM_OPINION_RECIPIENT = add_tyranny
}
}
}
# Regardless of what happens, scope:recipient is a bit miffed.
scope:recipient = {
add_opinion = {
target = scope:actor
modifier = slandered_me_opinion
opinion = {
value = scope:multiplied_diff
divide = -20
max = -10
}
}
}
custom_tooltip = scapegoat_counterpart_interaction.tt.infighting_sullies_the_realm
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
ai_targets = { ai_recipients = diarch }
ai_frequency = 12
ai_potential = {
OR = {
# Either they're a liege.
AND = {
has_active_diarchy = yes
# With suitable skill diffs to give some kind of a gain.
OR = {
diplomacy_diff = {
target = diarch
value >= 5
}
intrigue_diff = {
target = diarch
value >= 5
}
}
}
# Or they're the diarch.
AND = {
is_diarch = yes
# With suitable skill diffs to give some kind of a gain.
OR = {
diplomacy_diff = {
target = liege
value >= 5
}
intrigue_diff = {
target = liege
value >= 5
}
}
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
}
# Filter out some traits that would never do this.
NOR = {
has_trait = just
has_trait = honest
has_trait = loyal
}
}
ai_will_do = {
base = -50
# Opinion.
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -2.5
}
## Plus weight up a bit further for bad relationships.
first_valid = {
# Nemeses.
modifier = {
add = 200
has_relation_nemesis = scope:recipient
}
# Rivals.
modifier = {
add = 50
has_relation_rival = scope:recipient
}
}
# Traits.
## +++ Deceitful
modifier = {
add = 30
has_trait = deceitful
}
## +++ Ambitious
modifier = {
add = 30
has_trait = ambitious
}
## ++ Arrogant
modifier = {
add = 20
has_trait = arrogant
}
## ++ Arbitrary
modifier = {
add = 20
has_trait = arbitrary
}
## ++ Vengeful & doesn't like you
modifier = {
add = 20
has_trait = vengeful
opinion = {
target = scope:recipient
value <= -1
}
}
## + Sadistic
modifier = {
add = 10
has_trait = sadistic
}
## + Fickle
modifier = {
add = 10
has_trait = fickle
}
## + Eccentric
modifier = {
add = 10
has_trait = eccentric
}
## + Greedy
modifier = {
add = 10
has_trait = greedy
}
## - Generous
modifier = {
add = -10
has_trait = generous
}
## -- Compassionate
modifier = {
add = -20
has_trait = compassionate
}
## -- Craven
modifier = {
add = -20
has_trait = craven
}
## --- Forgiving
modifier = {
add = -30
has_trait = forgiving
}
## --- Humble
modifier = {
add = -30
has_trait = humble
}
## ---- Content
modifier = {
add = -50
has_trait = content
}
## We've already pre-filtered out Honest & Just.
# Dread.
## Intimidated.
modifier = {
add = -50
scope:actor = {
has_dread_level_towards = {
target = scope:recipient
level = 1
}
}
}
## Cowed.
modifier = {
add = -100
scope:actor = {
has_dread_level_towards = {
target = scope:recipient
level = 2
}
}
}
# Flag Management.
## Okay, we want to try and pick the larger of either our diplo diff or our intrigue diff.
### If our diplo diff is higher than our intrigue diff, go for diplo.
modifier = {
add = 4
scope:diplomacy_large = yes
scapegoat_counterpart_interaction_calc_diplo_diff_treshhold_value >= scapegoat_counterpart_interaction_calc_intrigue_diff_treshhold_value
}
### Else, go for intrigue.
modifier = {
add = 3
scope:intrigue_large = yes
}
### These two should never trigger, but we've got them here as fallbacks.
modifier = {
add = 2
scope:diplomacy_small = yes
}
modifier = {
add = 1
scope:intrigue_small = yes
}
### And then the AI otherwise doesn't worry about which smaller send option to pick.
# Influence status.
## Swimming in influence? Not worth it.
modifier = {
factor = 0
scope:actor.influence >= 500
}
## In debt? Weight it up.
modifier = {
factor = 2
scope:actor.influence <= -1
}
}
}
##################################################
# MANAGE DIARCHY INTERACTIONS
# Diarch or liege target their opposite number and sink currency to reaffirm their influence in the realm.
swing_scales_currency_interaction = {
category = interaction_category_diarch
common_interaction = yes
highlighted_reason = HIGHLIGHTED_CAN_SWING_SCALES
icon = scroll_scales
desc = swing_scales_currency_interaction_desc
interface_priority = 20
is_shown = {
# You must be one of the partners in a diarchy.
OR = {
scope:actor = { is_diarch_of_target = scope:recipient }
scope:recipient = { is_diarch_of_target = scope:actor }
}
}
is_valid_showing_failures_only = {
# Forbid when we're at max swing...
## ... for the regent.
trigger_if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:recipient.diarchy_swing < 100
}
}
## ... and for the liege.
trigger_if = {
limit = {
NOT = {
scope:actor = { has_diarchy_active_parameter = liege_may_voluntarily_cede_authority }
}
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
# As long as you're able to give something even vaguely like an order to someone who might advocate on your behalf, you're gucci.
scope:actor = {
is_imprisoned = no
age >= 8
}
# Must select something.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:swing_influence = yes
scope:swing_cede_authority = yes
scope:swing_prestige = yes
scope:swing_piety = yes
scope:swing_gold = yes
scope:swing_hook = yes
scope:swing_hof = yes
}
}
}
# And in the _rare_ circumstance that a diarch is a child, they must be at least this tall.
## Note that we _don't_ do this for the liege, since we want the player to be able to manage their regency — assume that _someone_ is looking out for the child's best interests.
scope:actor = {
trigger_if = {
limit = {
is_diarch_of_target = scope:recipient
is_adult = no
}
age >= 8
}
}
# Cannot be at war with each other.
NOT = {
scope:actor = { is_at_war_with = scope:recipient }
}
}
cooldown = { years = 2 }
cost = {
influence = {
if = {
limit = { always = scope:swing_influence }
value = scope:actor.swing_scales_influence_cost_value
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
if = {
limit = { scope:actor = { is_valid_for_legitimacy_change = yes } }
multiply = legitimacy_regent_swing_scale_multipler_value
}
}
}
prestige = {
if = {
limit = { always = scope:swing_prestige }
value = scope:actor.swing_scales_prestige_cost_value
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
if = {
limit = { scope:actor = { is_valid_for_legitimacy_change = yes } }
multiply = legitimacy_regent_swing_scale_multipler_value
}
}
}
piety = {
if = {
limit = {
OR = {
always = scope:swing_piety
always = scope:swing_hof
}
}
value = scope:actor.swing_scales_piety_cost_value
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
if = {
limit = { scope:actor = { is_valid_for_legitimacy_change = yes } }
multiply = legitimacy_regent_swing_scale_multipler_value
}
}
}
gold = {
if = {
limit = {
OR = {
always = scope:swing_gold
always = scope:swing_hof
}
}
value = scope:actor.swing_scales_cash_cost_value
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
if = {
limit = { scope:actor = { is_valid_for_legitimacy_change = yes } }
multiply = legitimacy_regent_swing_scale_multipler_value
}
}
}
}
# Influence
send_option = {
is_shown = {
# Make sure influence would be relevant.
OR = {
AND = {
scope:recipient.liege ?= scope:actor
scope:actor = { has_government = administrative_government }
}
AND = {
scope:actor.liege ?= scope:recipient
scope:recipient = { has_government = administrative_government }
}
}
}
is_valid = {
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
starts_enabled = { scope:actor.influence >= scope:actor.swing_scales_influence_cost_value }
flag = swing_influence
localization = SWING_INFLUENCE
current_description = SWING_INFLUENCE_DESC
}
# Cede control voluntarily.
send_option = {
is_shown = {
scope:actor = { has_diarchy_active_parameter = liege_may_voluntarily_cede_authority }
scope:recipient = { is_diarch_of_target = scope:actor }
}
is_valid = {
# Can't be a liege with the scales swung too far in favour of their diarch.
custom_tooltip = {
text = mulct_vizier_interaction.scales_too_swung.tt
scope:actor.diarchy_swing <= 90
}
}
starts_enabled = { scope:actor.influence >= scope:actor.swing_scales_influence_cost_value }
flag = swing_cede_authority
localization = SWING_CEDE_AUTHORITY
current_description = SWING_CEDE_AUTHORITY_DESC
}
# Prestige
send_option = {
starts_enabled = { scope:actor.prestige >= scope:actor.swing_scales_prestige_cost_value }
is_valid = {
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
flag = swing_prestige
localization = SWING_PRESTIGE
current_description = SWING_PRESTIGE_DESC
}
# Piety
send_option = {
is_valid = {
# You must share a HoF to be able to petition one.
custom_tooltip = {
text = swing_scales_currency_interaction.tt.no_shared_hof
# We're also secretly just testing if characters are the same faith.
OR = {
scope:actor.faith = scope:recipient.faith
AND = {
exists = scope:actor.faith.religious_head
exists = scope:recipient.faith.religious_head
scope:actor.faith.religious_head = scope:recipient.faith.religious_head
}
}
}
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
starts_enabled = { scope:actor.piety >= scope:actor.swing_scales_piety_cost_value }
flag = swing_piety
localization = SWING_PIETY
current_description = SWING_PIETY_DESC
}
# Gold
send_option = {
is_shown = {
# Filter out for the liege in vizierates - they can mulct the vizier, so we don't give them the chance to spend that gold back.
interaction_actor_is_liege_with_vizierate_trigger = no
}
starts_enabled = { scope:actor.gold >= scope:actor.swing_scales_cash_cost_value }
is_valid = {
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
flag = swing_gold
localization = SWING_GOLD
current_description = SWING_GOLD_DESC
}
# Hook
send_option = {
starts_enabled = {
scope:actor = { has_usable_hook = scope:recipient }
}
is_valid = {
scope:actor = { has_usable_hook = scope:recipient }
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
flag = swing_hook
localization = SWING_HOOK
current_description = SWING_HOOK_DESC
}
# HoF
send_option = {
is_shown = {
# Filter out for the liege in vizierates - they can mulct the vizier, so we don't give them the chance to spend that gold back.
interaction_actor_is_liege_with_vizierate_trigger = no
}
is_valid = {
diarch_swing_scales_valid_shared_hof_trigger = yes
# Can't be a liege with the scales swung completely towards them.
trigger_if = {
limit = {
scope:recipient = { is_diarch_of_target = scope:actor }
}
custom_tooltip = {
text = swing_scales_currency_interaction.tt.scales_max_swung
scope:actor.diarchy_swing > 0
}
}
}
# Top of the prio order for enablement.
starts_enabled = { diarch_swing_scales_valid_shared_hof_trigger = yes }
flag = swing_hof
localization = SWING_HOF
current_description = SWING_HOF_DESC
}
on_accept = {
# Swing the scales in the direction of scope:actor.
scope:recipient = {
# Swing the scales up if we're ceding power.
if = {
limit = { scope:swing_cede_authority = yes }
send_interface_message = {
type = msg_mandate_results_neutral_effect
title = swing_scales_interaction_by_liege.t
right_icon = scope:actor
scope:actor = {
# Viziers give you more bang for your buck when swinging against 'em.
# Perk check for Voyager perk
if = {
limit = {
has_diarchy_active_parameter = lieges_swing_more_against_diarchs
has_perk = power_at_home_perk
is_travelling = yes
}
update_diarchy_swing_with_perspective_effect = {
SWING = monumental_sop_swing_diarch_gain
LIEGE = scope:actor
}
}
# Perk or Vizier
else_if = {
limit = {
OR = {
has_diarchy_active_parameter = lieges_swing_more_against_diarchs
AND = {
has_perk = power_at_home_perk
is_travelling = yes
}
}
}
update_diarchy_swing_with_perspective_effect = {
SWING = massive_sop_swing_diarch_gain
LIEGE = scope:actor
}
}
# Neither
else = {
update_diarchy_swing_with_perspective_effect = {
SWING = major_sop_swing_diarch_gain
LIEGE = scope:actor
}
}
diarch_swing_scales_guts_effect = yes
# Plus, everyone benefits.
change_influence = {
value = 200
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
multiply = legitimacy_regent_swing_scale_multipler_value
round = yes
}
scope:recipient = {
change_influence = {
value = 200
# LEGITIMACY OF RULER AFFECTS COSTS FOR REGENTS
multiply = legitimacy_regent_swing_scale_multipler_value
round = yes
}
}
}
}
}
# Swing the scales down if this is the liege.
else_if = {
limit = { is_diarch_of_target = scope:actor }
send_interface_message = {
type = msg_mandate_results_bad_effect
title = swing_scales_interaction_by_liege.t
right_icon = scope:actor
scope:actor = {
# Viziers give you more bang for your buck when swinging against 'em.
# Perk check for Voyager perk
if = {
limit = {
has_diarchy_active_parameter = lieges_swing_more_against_diarchs
has_perk = power_at_home_perk
is_travelling = yes
}
update_diarchy_swing_with_perspective_effect = {
SWING = massive_sop_swing_liege_gain
LIEGE = scope:actor
}
}
# Perk or Vizier
else_if = {
limit = {
OR = {
has_diarchy_active_parameter = lieges_swing_more_against_diarchs
AND = {
has_perk = power_at_home_perk
is_travelling = yes
}
}
}
update_diarchy_swing_with_perspective_effect = {
SWING = major_sop_swing_liege_gain
LIEGE = scope:actor
}
}
# Neither
else = {
update_diarchy_swing_with_perspective_effect = {
SWING = medium_sop_swing_liege_gain
LIEGE = scope:actor
}
}
diarch_swing_scales_guts_effect = yes
}
}
}
# And up if this is the diarch.
else = {
send_interface_message = {
type = msg_mandate_results_bad_effect
title = swing_scales_interaction_by_diarch.t
right_icon = scope:actor
if = {
limit = {
scope:actor = {
has_perk = power_at_home_perk
is_travelling = yes
}
}
update_diarchy_swing_with_perspective_effect = {
SWING = major_sop_swing_diarch_gain
LIEGE = scope:recipient
}
}
else = {
update_diarchy_swing_with_perspective_effect = {
SWING = medium_sop_swing_diarch_gain
LIEGE = scope:recipient
}
}
scope:actor = { diarch_swing_scales_guts_effect = yes }
}
}
}
# Unless you gave power to them, scope:recipient is a bit miffed.
scope:recipient = {
# We're actually giving them swing, so gain opinion.
## We lessen the gains from this over time, as they become more and more entitled.
if = {
limit = { scope:swing_cede_authority = yes }
# Actual gains.
if = {
limit = {
OR = {
NOT = { has_variable = diarch_authority_ceded }
var:diarch_authority_ceded < diarch_authority_ceded_opinion_value
}
}
# First, check to see how much opinion we should give.
save_scope_value_as = {
name = opinion_gain
value = {
value = diarch_authority_ceded_opinion_value
if = {
limit = { has_variable = diarch_authority_ceded }
subtract = var:diarch_authority_ceded
}
}
}
# Then, adjust the opinion.
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = scope:opinion_gain
}
# And decrease our gain next time.
increment_variable_effect = {
VAR = diarch_authority_ceded
VAL = 5
}
}
# Otherwise, a paltry amount.
## We're deliberately giving you basically nothing here — the 1 is for comedic effect.
else = {
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 1
}
}
}
# Co-monarchs are more annoyed.
else_if = {
limit = {
OR = {
AND = {
scope:actor = { is_diarch_of_target = scope:recipient }
scope:recipient = { has_diarchy_active_parameter = diarchy_is_co_rulership }
}
AND = {
scope:recipient = { is_diarch_of_target = scope:actor }
scope:actor = { has_diarchy_active_parameter = diarchy_is_co_rulership }
}
}
}
add_opinion = {
target = scope:actor
modifier = frustrated_opinion
opinion = -20
}
}
# Take away a normal amount.
else = {
add_opinion = {
target = scope:actor
modifier = frustrated_opinion
opinion = -10
}
}
}
# Some diarchs might be swinging as a prelude to a coup attempt.
ai_diarch_check_to_see_if_should_launch_coup_effect = yes
# Debug & object explorer logging.
## Diarch swung.
if = {
limit = {
exists = scope:recipient.diarch
scope:actor = scope:recipient.diarch
}
debug_log = debug_log.swing_scales.diarch_swung
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_swung_diarch }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_swung_diarch_list }
}
}
## Else liege swung.
else = {
debug_log = debug_log.swing_scales.liege_swung
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_swung_liege }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_swung_liege_list }
}
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
ai_targets = { ai_recipients = diarch }
ai_frequency = 24
ai_potential = {
OR = {
# Either they're a liege.
AND = {
has_active_diarchy = yes
# With some kind of valid cause to worry.
OR = {
# Lieges don't care unless your regency is entrenched _and_ it's looking to stay that way...
has_diarchy_active_parameter = regency_cant_be_ended_above_this_point
# ... unless they could get out of it.
can_leave_diarchy_trigger = yes
}
}
# Or they're the diarch.
AND = {
is_diarch = yes
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
}
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_secondary_powers_base_value
# Additions.
## Flag management.
### Influence.
modifier = {
add = 6
scope:swing_influence = yes
}
### Cede Authority.
#### Only do this if you're also humble.
modifier = {
add = 10
scope:swing_cede_authority = yes
has_trait = humble
}
### Prestige.
modifier = {
add = 2
scope:swing_prestige = yes
}
### Piety.
modifier = {
add = 3
scope:swing_piety = yes
}
### Gold.
modifier = {
add = 1
scope:swing_gold = yes
}
### Hook.
modifier = {
add = 5
scope:swing_hook = yes
}
### HoF - combined Gold/Piety.
modifier = {
add = 4
scope:swing_hof = yes
}
# Factors.
## x0 Don't go into prestige debt!
modifier = {
factor = 0
scope:swing_prestige = yes
prestige < 0
}
## We otherwise take care of these in the ai_potential block, because otherwise the AI interacts very, very weirdly with them.
}
}
# For titleless diarchs: anyone playable uses the regular interaction.
diarch_swing_scales_currency_interaction = {
category = interaction_category_diarch
common_interaction = yes
diarch_interaction = yes
highlighted_reason = HIGHLIGHTED_CAN_SWING_SCALES
icon = scroll_scales
desc = swing_scales_currency_interaction_desc
interface_priority = 20
is_shown = {
scope:recipient = scope:actor.liege
# This is for landless diarchs only, and we pre-filter them, so we don't really care about this block.
## But filter out players anyway for that _seamless_ debug play experience.
scope:actor = { is_ai = yes }
}
is_valid_showing_failures_only = {
# Forbid when we're at max swing.
scope:recipient = {
# Plus also weed out some weird errors where we got confused and looked at ourselves.
has_active_diarchy = yes
# Now the actual check.
trigger_if = {
limit = { has_active_diarchy = yes }
diarchy_swing < 100
}
trigger_else = { always = no }
}
# As long as you're able to give something even vaguely like an order to someone who might advocate on your behalf, you're gucci.
scope:actor = { is_imprisoned = no }
# And in the _rare_ circumstance that a diarch is a child, they must be at least this tall.
## Note that we _don't_ do this for the liege, since we want the player to be able to manage their regency — assume that _someone_ is looking out for the child's best interests.
scope:actor = {
trigger_if = {
limit = {
is_diarch_of_target = scope:recipient
is_adult = no
}
age >= 8
}
}
}
cooldown = { years = 2 }
cost = {
influence = {
if = {
limit = { always = scope:swing_influence }
# Diarch version.
if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
# Costs should always be applied on the diarch.
add = scope:actor.swing_scales_influence_cost_value
}
# Liege version.
else = {
# Costs should always be applied on the diarch.
add = scope:recipient.swing_scales_influence_cost_value
}
# Cost scaling mults.
multiply = scope:actor.swing_scales_discounts_multiplier_value
}
}
prestige = {
if = {
limit = { always = scope:swing_prestige }
# Diarch version.
if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
# Costs should always be applied on the diarch.
add = scope:actor.swing_scales_prestige_cost_value
}
# Liege version.
else = {
# Costs should always be applied on the diarch.
add = scope:recipient.swing_scales_prestige_cost_value
}
# Cost scaling mults.
multiply = scope:actor.swing_scales_discounts_multiplier_value
}
}
piety = {
if = {
limit = {
OR = {
always = scope:swing_piety
always = scope:swing_hof
}
}
# Diarch version.
if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
# Costs should always be applied on the diarch.
add = scope:actor.swing_scales_piety_cost_value
}
# Liege version.
else = {
# Costs should always be applied on the diarch.
add = scope:recipient.swing_scales_piety_cost_value
}
# Cost scaling mults.
multiply = scope:actor.swing_scales_discounts_multiplier_value
}
}
gold = {
if = {
limit = {
OR = {
always = scope:swing_gold
always = scope:swing_hof
}
}
# Diarch version.
if = {
limit = {
scope:actor = { is_diarch_of_target = scope:recipient }
}
# Costs should always be applied on the diarch.
add = scope:actor.swing_scales_cash_cost_value
}
# Liege version.
else = {
# Costs should always be applied on the diarch.
add = scope:recipient.swing_scales_cash_cost_value
}
# Cost scaling mults.
multiply = scope:actor.swing_scales_discounts_multiplier_value
}
}
}
# Influence
send_option = {
is_shown = {
# Make sure influence would be relevant.
OR = {
AND = {
scope:recipient.liege ?= scope:actor
scope:actor = { has_government = administrative_government }
}
AND = {
scope:actor.liege ?= scope:recipient
scope:recipient = { has_government = administrative_government }
}
}
}
starts_enabled = { scope:actor.influence >= scope:actor.swing_scales_influence_cost_value }
flag = swing_influence
localization = SWING_INFLUENCE
current_description = SWING_INFLUENCE_DESC
}
# Prestige
send_option = {
starts_enabled = { scope:actor.prestige >= scope:actor.swing_scales_prestige_cost_value }
flag = swing_prestige
localization = SWING_PRESTIGE
}
# Piety
send_option = {
is_valid = {
# You must share a HoF to be able to petition one.
custom_tooltip = {
text = swing_scales_currency_interaction.tt.no_shared_hof
# We're also secretly just testing if characters are the same faith.
OR = {
scope:actor.faith = scope:recipient.faith
AND = {
exists = scope:actor.faith.religious_head
exists = scope:recipient.faith.religious_head
scope:actor.faith.religious_head = scope:recipient.faith.religious_head
}
}
}
}
starts_enabled = { scope:actor.piety >= scope:actor.swing_scales_piety_cost_value }
flag = swing_piety
localization = SWING_PIETY
}
# Gold
send_option = {
starts_enabled = { scope:actor.gold >= scope:actor.swing_scales_cash_cost_value }
flag = swing_gold
localization = SWING_GOLD
}
# Hook
send_option = {
is_valid = {
scope:actor = { has_usable_hook = scope:recipient }
}
starts_enabled = {
scope:actor = { has_usable_hook = scope:recipient }
}
flag = swing_hook
localization = SWING_HOOK
}
# HoF
send_option = {
is_valid = { diarch_swing_scales_valid_shared_hof_trigger = yes }
# Top of the prio order for enablement.
starts_enabled = { diarch_swing_scales_valid_shared_hof_trigger = yes }
flag = swing_hof
localization = SWING_HOF
}
on_accept = {
# Swing the scales down, since scope:actor is always a landless diarch.
scope:recipient = {
# Slight chance delays may lead to a diarchy ending before this is received.
if = {
limit = { has_active_diarchy = yes }
send_interface_message = {
type = msg_mandate_results_bad_effect
title = swing_scales_interaction_by_diarch.t
right_icon = scope:actor
update_diarchy_swing_with_perspective_effect = {
SWING = medium_sop_swing_diarch_gain
LIEGE = scope:recipient
}
scope:actor = { diarch_swing_scales_guts_effect = yes }
}
}
# Scope:recipient is a bit miffed.
add_opinion = {
target = scope:actor
modifier = frustrated_opinion
opinion = -10
}
}
# Some diarchs might be swinging as a prelude to a coup attempt.
ai_diarch_check_to_see_if_should_launch_coup_effect = yes
# Debug logging.
debug_log = debug_log.swing_scales.diarch_swung
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_swung_diarch }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_swung_diarch_list }
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
# We turn the frequency up higher than the cooldown so that diarchs don't take two years to get into the loop.
ai_frequency = 6
ai_potential = {
# Double check due to some irritating errors.
is_diarch = yes
liege = { has_active_diarchy = yes }
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# We're generally ruthless here.
base = @ai_core_loop_base_value
# Additions.
## Flag management.
### Influence.
modifier = {
add = 6
scope:swing_influence = yes
}
### Prestige.
modifier = {
add = 2
scope:swing_prestige = yes
}
### Piety.
modifier = {
add = 3
scope:swing_piety = yes
}
### Gold.
modifier = {
add = 1
scope:swing_gold = yes
}
### Hook.
modifier = {
add = 5
scope:swing_hook = yes
}
### HoF - combined Gold/Piety.
modifier = {
add = 4
scope:swing_hof = yes
}
# Factors.
## x0 Don't go into prestige debt!
modifier = {
factor = 0
scope:swing_prestige = yes
prestige < 0
}
}
}
# Diarch (actor) shifts from a Temporary Regency to an Entrenched Regency.
diarch_entrench_regency_interaction = {
category = interaction_category_diarch
common_interaction = yes
diarch_interaction = yes
highlighted_reason = HIGHLIGHTED_CAN_DIARCH_ENTRENCH_REGENCY
icon = icon_entrench_regency
desc = diarch_entrench_regency_interaction_desc
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
# With the extra consideration that we only want this to appear for Temporary Regencies.
liege = { has_diarchy_parameter = unlock_entrench_regency_interaction }
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = unlock_entrench_regency_interaction }
# You must be able to act as diarch.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
}
on_accept = {
scope:recipient = {
# Tell scope:recipient what's up.
send_interface_toast = {
type = msg_start_diarchy
title = diarch_entrench_regency_interaction.tt.recipient_notification
left_icon = scope:actor
# Change the diarchy type to entrenched.
set_diarchy_type = regency
# Set our power level down a bit, but still higher than entrenched regencies that *start* that way would be.
set_diarchy_swing = 40
}
# Plus scope:recipient probably isn't super happy about this.
add_opinion = {
target = scope:actor
modifier = suspicion_opinion
opinion = -20
}
}
# Bit o'prestige for your hard work.
scope:actor = { add_prestige = medium_prestige_gain }
# Debug logging.
debug_log = debug_log.entrench_regency.attempt_made
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entrench }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entrench_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entrench_recipient_list }
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 6
ai_potential = {
is_diarch = yes
# Don't entrench for no reason — we want to have a bit of a delay so that the AI can go off travelling or get locked in prison once in a while.
liege = { years_in_diarchy >= 2 }
}
ai_will_do = {
# You never _don't_ want to do this.
base = 1000
}
}
# Diarch (actor) shifts from an Entrenched Regency to Co-Emperorship.
diarch_regent_appoints_self_co_emperor_interaction = {
category = interaction_category_diarch
common_interaction = yes
diarch_interaction = yes
icon = icon_entrench_regency
desc = diarch_regent_appoints_self_co_emperor_interaction_desc
popup_on_receive = yes
pause_on_receive = yes
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = liege
is_diarch_of_target = liege
# With the extra consideration that we only want this to appear for those who can actually _have_ co-emperors.
liege = {
has_diarchy_parameter = diarch_can_appoint_self_co_emperor
may_appoint_co_emperors_trigger = yes
}
}
}
is_valid_showing_failures_only = {
# Make sure scope:recipient is the liege.
custom_tooltip = {
text = custom_description.tt.must_target_liege
scope:recipient = scope:actor.liege
}
# Diarchs must have unlocked the appropriate power.
scope:actor.liege = { has_diarchy_active_parameter = diarch_can_appoint_self_co_emperor }
# You must be able to act as diarch.
diarch_cannot_be_disabled_trigger = { DIARCH = scope:actor }
}
cost = {
influence = {
# Rulers pay influence, non-rulers get a freebie (since they otherwise likely won't accrue the requisite influence).
if = {
limit = {
scope:actor = { is_ruler = yes }
}
value = 500
}
# If we're doing this vs. someone who could leave a regency, it's significantly costlier.
if = {
limit = {
scope:recipient = { regency_for_personal_reasons_trigger = no }
}
add = 1000
}
}
}
on_accept = {
scope:recipient = {
#TODO_CD_EP3_POLISH; this should really be a letter event rather than just a notification, plus notifications for player governors.
# Tell scope:recipient what's up.
send_interface_toast = {
type = msg_start_diarchy
title = diarch_regent_appoints_self_co_emperor_interaction.tt.recipient_notification
left_icon = scope:actor
# Change the diarchy type to a co-emperorship.
custom_tooltip = {
text = diarch_regent_appoints_self_co_emperor_interaction.tt.become_co_emperorship
set_diarchy_type = co_emperorship
}
# Set our power level down a bit, we've just got one helluva prize.
custom_tooltip = {
text = diarch_regent_appoints_self_co_emperor_interaction.tt.set_swing
set_diarchy_swing = diarch_regent_appoints_self_co_emperor_interaction_sop_swing_set_value
}
add_legitimacy = minor_legitimacy_loss
}
# Plus scope:recipient probably isn't super happy about this.
add_opinion = {
target = scope:actor
modifier = suspicion_opinion
opinion = -50
}
}
# Notify the player about the price spike.
if = {
limit = {
scope:recipient = { regency_for_personal_reasons_trigger = yes }
}
custom_tooltip = diarch_regent_appoints_self_co_emperor_interaction.tt.adults_cost_more
}
else = { custom_tooltip = diarch_regent_appoints_self_co_emperor_interaction.children_cost_less }
# Bit o'prestige for your hard work.
scope:actor = { add_prestige = medium_prestige_gain }
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 12
ai_potential = {
is_diarch = yes
# Filter us down nice'n'tight.
liege = { may_appoint_co_emperors_trigger = yes }
# Loyal diarchs don't engage in skullduggery.
diarch_loyalty < diarch_loyalty_visibly_loyal_threshold
}
ai_will_do = {
# You never _don't_ want to do this.
base = 1000
}
}
# Liege (actor) ends a Temporary Regency.
liege_dismiss_temporary_regency_interaction = {
category = interaction_category_diarch
common_interaction = yes
icon = icon_dismiss_temporary_regency
desc = liege_dismiss_temporary_regency_interaction_desc
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = diarch
diarch = scope:recipient
# With the extra consideration that we only want this to appear for Temporary Regencies.
has_diarchy_parameter = can_be_instantly_dismissed
}
}
is_valid_showing_failures_only = {
# Basic requirements must be fulfilled.
scope:actor = { can_leave_diarchy_trigger = yes }
}
on_accept = {
scope:actor = {
# Tell scope:recipient what's up.
send_interface_toast = {
type = event_toast_effect_neutral
title = liege_dismiss_temporary_regency_interaction.tt.recipient_notification
left_icon = scope:actor
# End the diarchy.
end_diarchy = yes
scope:recipient = {
# Bit o'prestige for your hard work.
if = {
limit = {
exists = dynasty
NOT = {
exists = scope:actor.dynasty.dynast
dynasty.dynast = scope:actor.dynasty.dynast
}
}
custom_tooltip = liege_dismiss_temporary_regency_interaction.tt.dynasty_receives_prestige
hidden_effect = {
dynasty = { add_dynasty_prestige = liege_dismiss_temporary_regency_interaction_dynasty_prestige_value }
}
}
else = { add_prestige = medium_prestige_gain }
}
}
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_dismtemp_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_dismtemp_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_dismtemp_accept_recipient_list }
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = diarch }
ai_frequency = 24
ai_potential = { has_active_diarchy = yes }
ai_will_do = {
# You never _don't_ want to do this.
base = 1000
}
}
# Liege (actor) moves to end an Entrenched Regency.
liege_dismiss_entrenched_regency_interaction = {
category = interaction_category_diarch
common_interaction = yes
notification_text = liege_dismiss_entrenched_regency_interaction_proposal
icon = icon_dismiss_entrenched_regency
desc = liege_dismiss_entrenched_regency_interaction_desc
ai_maybe = yes
can_send_despite_rejection = yes
popup_on_receive = yes
pause_on_receive = yes
interface_priority = 60
ai_min_reply_days = 4
ai_max_reply_days = 9
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
exists = diarch
diarch = scope:recipient
# With the extra consideration that we only want this to appear for Entrenched Regencies.
has_diarchy_parameter = dismissal_requires_gift
}
}
cooldown = { years = 1 }
is_valid_showing_failures_only = {
# Basic requirements must be fulfilled.
scope:actor = { can_leave_diarchy_trigger = yes }
# And you mustn't be locked in by your regent's power.
scope:actor = {
NOT = { has_diarchy_active_parameter = regency_cant_be_ended_above_this_point }
}
# Must select something.
trigger_if = {
# AI won't exploit and need this exception, as they don't actually open the windows, so they'll be blocked from taking the interaction otherwise.
limit = {
scope:actor = { is_ai = no }
}
custom_tooltip = {
text = interactions_general.tt.must_select_one_option
OR = {
scope:diarchy_ending_gift_unnecessary = yes
scope:diarchy_ending_gift_stiffed = yes
scope:diarchy_ending_gift_hook = yes
scope:diarchy_ending_gift_dynasty_prestige = yes
scope:diarchy_ending_gift_piety = yes
scope:diarchy_ending_gift_cash = yes
}
}
}
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
# Ending gifts.
send_options_exclusive = yes
## No gift required.
send_option = {
flag = diarchy_ending_gift_unnecessary
current_description = diarchy_ending_gift_unnecessary_desc
is_shown = {
scope:actor = {
NOT = { has_diarchy_active_parameter = regency_free_end_below_this_point }
}
}
}
## Stiff scope:recipient for opinion loss.
send_option = {
flag = diarchy_ending_gift_stiffed
current_description = diarchy_ending_gift_stiffed_desc
is_shown = {
scope:actor = { has_diarchy_active_parameter = regency_free_end_below_this_point }
}
}
## A hook for scope:recipient on scope:actor.
send_option = {
flag = diarchy_ending_gift_hook
current_description = diarchy_ending_gift_hook_desc
is_shown = {
scope:recipient = {
NOT = { has_hook = scope:actor }
}
}
}
## Transfer some of your prestige into their dynasty prestige.
send_option = {
flag = diarchy_ending_gift_dynasty_prestige
current_description = diarchy_ending_gift_dynasty_prestige_desc
is_shown = {
# Filter out characters with no dynasty.
exists = scope:recipient.dynasty
# And make sure that they don't share a dynasty.
trigger_if = {
limit = { exists = scope:actor.dynasty }
NOT = {
scope:actor.dynasty = scope:recipient.dynasty
}
}
}
}
## Pray for them to transfer piety.
### Requires same-HoF.
send_option = {
flag = diarchy_ending_gift_piety
current_description = diarchy_ending_gift_piety_desc
is_shown = {
shared_faith_or_hof_trigger = {
ACTOR = scope:actor
RECIPIENT = scope:recipient
}
}
}
## Cash.
send_option = {
flag = diarchy_ending_gift_cash
current_description = diarchy_ending_gift_cash_desc
}
on_send = {
scope:actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
# Remove the waiting flag.
add_character_flag = trying_to_dismiss_regent
}
}
on_accept = {
# End the diarchy.
scope:actor = { end_diarchy = yes }
scope:recipient = {
# Transfer a gift.
## ... or don't, 'cause one isn't necessary!
if = {
limit = { scope:diarchy_ending_gift_unnecessary = yes }
custom_tooltip = liege_dismiss_entrenched_regency_interaction.tt.no_gift_necessary
}
## Give 'em *nothing*, even though they earnt it.
if = {
limit = { scope:diarchy_ending_gift_stiffed = yes }
custom_tooltip = liege_dismiss_entrenched_regency_interaction.tt.stiff_them
# Scope:recipient is unhappy about this.
if = {
limit = { is_ai = yes }
# More so if they're arrogant, as they take such a smack in the face even more on the proverbial nose.
if = {
limit = { has_trait = arrogant }
add_opinion = {
target = scope:actor
modifier = insult_opinion
opinion = -50
}
}
else = {
add_opinion = {
target = scope:actor
modifier = disappointed_opinion
opinion = -30
}
}
}
}
## Give 'em a hook.
if = {
limit = { scope:diarchy_ending_gift_hook = yes }
# Transfer the hook.
add_hook = {
type = favor_hook
target = scope:actor
}
# Plus they're happy.
if = {
limit = { is_ai = yes }
# More so if they're deceitful, since they value favours.
if = {
limit = { has_trait = deceitful }
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 30
}
}
else = {
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 15
}
}
}
}
## Give 'em some dynasty prestige.
if = {
limit = { scope:diarchy_ending_gift_dynasty_prestige = yes }
scope:actor = { add_prestige = minor_prestige_loss }
# Transfer the prestige.
custom_tooltip = liege_dismiss_entrenched_regency_interaction.tt.dynasty_receives_prestige
hidden_effect = {
dynasty = { add_dynasty_prestige = liege_dismiss_entrenched_regency_interaction_dynasty_prestige_value }
}
# Plus they're happy.
if = {
limit = { is_ai = yes }
# More so if they're the dynasty head, as then they can make use of it.
if = {
limit = { dynasty.dynast = scope:recipient }
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 30
}
}
else = {
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 15
}
}
}
}
## Give 'em some piety.
if = {
limit = { scope:diarchy_ending_gift_piety = yes }
# Transfer the piety.
scope:actor = { add_piety = medium_piety_loss }
add_piety = major_piety_value
# Plus they're happy.
if = {
limit = { is_ai = yes }
# More so if they're zealous, as zealots like piety.
if = {
limit = { has_trait = zealous }
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 30
}
}
else = {
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 15
}
}
}
}
## Five 'em cold, hard cash.
if = {
limit = { scope:diarchy_ending_gift_cash = yes }
# Transfer the cash.
scope:actor = {
pay_short_term_gold = {
target = scope:recipient
gold = major_gold_value
}
}
# Plus they're happy.
if = {
limit = { is_ai = yes }
# More so if they're greedy, 'cause greedy likes money.
if = {
limit = { has_trait = greedy }
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 30
}
}
else = {
add_opinion = {
target = scope:actor
modifier = pleased_opinion
opinion = 15
}
}
}
}
}
# Object explorer logging.
if = {
limit = { always = scope:diarchy_ending_gift_unnecessary }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_unnecessary_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_unnecessary_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_unnecessary_accept_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_stiffed }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_stiffed_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_stiffed_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_stiffed_accept_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_hook }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_hook_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_hook_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_hook_accept_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_dynasty_prestige }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_dynpres_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_dynpres_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_dynpres_accept_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_piety }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_piety_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_piety_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_piety_accept_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_cash }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_cash_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_cash_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_cash_accept_recipient_list }
}
}
}
on_decline = {
scope:actor = {
# Attempting to assert authority pushes scope:actor's scales in their favour.
update_diarchy_swing_with_perspective_effect = {
SWING = major_sop_swing_liege_gain
LIEGE = scope:actor
}
# Plus AI don't like being told *no*.
if = {
limit = { is_ai = no }
add_opinion = {
target = scope:recipient
modifier = trust_opinion
opinion = -30
}
}
}
# Clean-up that pesky flag.
if = {
limit = {
scope:actor = { has_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = { remove_character_flag = flag_hostile_actions_disabled_delay }
}
# And add a _new_ pesky flag to stop 'em doubling up whilst also telling them to try to take this interaction again AQAP.
## This is to stop the AI from failing to tackle this efficiently.
scope:actor = {
if = {
limit = { is_ai = yes }
add_character_flag = trying_to_dismiss_regent
trigger_event = {
id = diarchy.0111
days = 366
}
}
}
# Object explorer logging.
if = {
limit = { always = scope:diarchy_ending_gift_stiffed }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_stiffed_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_stiffed_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_stiffed_decline_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_hook }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_hook_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_hook_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_hook_decline_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_dynasty_prestige }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_dynpres_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_dynpres_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_dynpres_decline_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_piety }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_piety_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_piety_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_piety_decline_recipient_list }
}
}
else_if = {
limit = { always = scope:diarchy_ending_gift_cash }
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_cash_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_cash_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_cash_decline_recipient_list }
}
}
}
auto_accept = {
custom_tooltip = {
text = liege_dismiss_entrenched_regency_interaction.tt.force_ending
scope:diarchy_ending_gift_unnecessary = yes
}
}
ai_accept = {
# Diarchs don't *want* to agree, by default...
base = 0
# ... except loyal ones, who really, really do...
modifier = {
add = 100
desc = liege_dismiss_entrenched_regency_interaction.modifier.desc.loyal_diarch
diarch_loyalty >= diarch_loyalty_visibly_loyal_threshold
}
# ... plus inactive ones, who can't really refuse.
modifier = {
add = 50
desc = liege_dismiss_entrenched_regency_interaction.modifier.desc.is_disabled
scope:recipient = { is_diarch_able_trigger = no }
}
# If you could just end the diarchy without any fuss, then they're much more inclined to agree.
modifier = {
add = 1000
desc = liege_dismiss_entrenched_regency_interaction.modifier.desc.could_freely_dismiss_me
scope:actor = {
NOT = { has_diarchy_active_parameter = regency_free_end_below_this_point }
}
}
# Factor for diplomacy.
## Yours.
modifier = {
add = {
value = scope:actor.diplomacy
multiply = 2
}
desc = INTERACTION_DIPLOMACY_ACTOR
}
## Theirs.
modifier = {
add = {
value = scope:recipient.diplomacy
multiply = -2
}
desc = INTERACTION_DIPLOMACY_RECIPIENT
}
# Factor for opinion.
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.5
desc = AI_OPINION_REASON
}
# Factor for AI personalities.
ai_value_modifier = {
ai_honor = 1
ai_boldness = -0.5
}
# Factor for Scales of Power.
modifier = {
add = {
value = scope:actor.diarchy_swing
# Reduce by 40.
## 20 is (currently) the node at which things become free, so we want to subtract above this point and invert below it.
## The extra -20 is so that diarchs are more willing to go in exchange for a gift when their power is ebbing, rather than holding on until they can be discharged without one.
add = -40
# Invert it, since scope:actor wants low scales.
multiply = -1
}
desc = INTERACTION_SCALES_OF_POWER
}
# Intimidation.
## Intimidated.
modifier = {
add = intimidated_halved_reason_value
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 1
}
}
desc = INTIMIDATED_REASON
}
## Cowed.
modifier = {
add = cowed_halved_reason_value
scope:recipient = {
has_dread_level_towards = {
target = scope:actor
level = 2
}
}
desc = COWED_REASON
}
# Factor for low grandeur.
## 1 level below.
modifier = {
add = -20
desc = GRANDEUR_REASON
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level <= 1_levels_below_expected_level
court_grandeur_current_level > 3_levels_below_expected_level
}
## 3 levels below.
modifier = {
add = -40
desc = GRANDEUR_REASON
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level <= 3_levels_below_expected_level
court_grandeur_current_level > 5_levels_below_expected_level
}
## 5 levels below.
modifier = {
add = -60
desc = GRANDEUR_REASON
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level <= 5_levels_below_expected_level
court_grandeur_current_level > 7_levels_below_expected_level
}
## 7 levels below.
modifier = {
add = -80
desc = GRANDEUR_REASON
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level <= 7_levels_below_expected_level
court_grandeur_current_level > 9_levels_below_expected_level
}
## 9 levels below.
modifier = {
add = -100
desc = GRANDEUR_REASON
has_royal_court = yes
has_dlc_feature = royal_court
court_grandeur_current_level <= 9_levels_below_expected_level
}
# Negative relationships.
## Rival.
modifier = {
add = -50
desc = offer_vassalization_interaction_aibehavior_rival_tt
scope:recipient = {
has_relation_rival = scope:actor
NOT = { has_relation_nemesis = scope:actor }
}
}
## Nemesis.
modifier = {
add = -100
desc = offer_vassalization_interaction_aibehavior_nemesis_tt
scope:recipient = { has_relation_nemesis = scope:actor }
}
# Plus for whether you're offering a gift and if it's one they need or not.
## No gift offered.
### No base-vs.-trait modifier here, as we want arrogant characters to be dramatic little bastards.
modifier = {
add = -30
desc = AI_OPINION_OFFENDED
scope:diarchy_ending_gift_stiffed = yes
}
## Favour.
### Deceitful variant.
modifier = {
add = 60
desc = liege_dismiss_entrenched_regency_interaction.tt.deceitful_likes_hook
scope:diarchy_ending_gift_hook = yes
has_trait = deceitful
}
### Base variant.
modifier = {
add = 30
desc = liege_dismiss_entrenched_regency_interaction.tt.offered_gift
scope:diarchy_ending_gift_hook = yes
NOT = { has_trait = deceitful }
}
## Dynasty Prestige.
### Dynasty Head variant.
modifier = {
add = 60
desc = liege_dismiss_entrenched_regency_interaction.tt.dynasty_head_likes_dynasty_prestige
scope:diarchy_ending_gift_dynasty_prestige = yes
this = dynasty.dynast
}
### Base variant.
modifier = {
add = 30
desc = liege_dismiss_entrenched_regency_interaction.tt.offered_gift
scope:diarchy_ending_gift_dynasty_prestige = yes
NOT = { this = dynasty.dynast }
}
## Piety.
### Zealous variant.
modifier = {
add = 60
desc = liege_dismiss_entrenched_regency_interaction.tt.zealous_likes_piety
scope:diarchy_ending_gift_piety = yes
has_trait = zealous
}
### Base variant.
modifier = {
add = 30
desc = liege_dismiss_entrenched_regency_interaction.tt.offered_gift
scope:diarchy_ending_gift_piety = yes
NOT = { has_trait = zealous }
}
## Cash.
### Greedy variant.
modifier = {
add = 60
desc = liege_dismiss_entrenched_regency_interaction.tt.greedy_likes_cash
scope:diarchy_ending_gift_cash = yes
has_trait = greedy
}
### Base variant.
modifier = {
add = 30
desc = liege_dismiss_entrenched_regency_interaction.tt.offered_gift
scope:diarchy_ending_gift_cash = yes
NOT = { has_trait = greedy }
}
### Also debters like this.
modifier = {
add = 60
desc = PT_AI_IS_IN_DEBT
scope:diarchy_ending_gift_cash = yes
debt_level >= 1
}
}
# AI
ai_targets = { ai_recipients = diarch }
ai_frequency = 24
ai_potential = {
# Are we in a diarchy at all?
has_active_diarchy = yes
# Can we leave it?
can_leave_diarchy_trigger = yes
# Are we locked into a speed-leave cycle?
NOT = { has_character_flag = trying_to_dismiss_regent }
}
ai_will_do = {
# You never _don't_ want to do this.
base = 1000
# Flag management.
## Auto-dismiss.
modifier = {
add = 10
scope:diarchy_ending_gift_unnecessary = yes
}
## Stiff 'em.
### If we hate the diarch, try to stiff them till we can dismiss 'em.
modifier = {
scope:diarchy_ending_gift_stiffed = yes
add = 9
diarch_liege_wants_to_stiff_regent_trigger = yes
}
### Otherwise, try to down prio this. It'll just make things harder.
modifier = {
scope:diarchy_ending_gift_stiffed = yes
add = 1
diarch_liege_wants_to_stiff_regent_trigger = no
}
## Hook.
modifier = {
add = 4
scope:diarchy_ending_gift_hook = yes
}
## Dynasty Prestige.
modifier = {
add = 5
scope:diarchy_ending_gift_dynasty_prestige = yes
}
## Piety.
modifier = {
add = 2
scope:diarchy_ending_gift_piety = yes
}
## Cash.
modifier = {
add = 3
scope:diarchy_ending_gift_cash = yes
}
}
}
# Liege (actor) dismisses a Vizierate.
liege_dismiss_vizier_interaction = {
category = interaction_category_diarch
common_interaction = yes
icon = icon_dismiss_temporary_regency
desc = liege_dismiss_vizier_interaction_desc
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Diarchy checks for scope:actor.
scope:actor = {
# If you're not in a diarchy, we don't care.
diarch ?= scope:recipient
# With the extra consideration that we only want this to appear for Vizierates.
has_diarchy_parameter = primeminister_dismissal_will_upset_administration
}
}
is_valid_showing_failures_only = {
# Basic requirements must be fulfilled.
scope:actor = { can_leave_diarchy_trigger = yes }
}
cooldown = { years = 5 }
on_accept = {
scope:actor = {
# We've dismissed your vizier!
## Do we need to give a warning tooltip first?
if = {
limit = { has_diarchy_active_parameter = primeminister_dismissal_will_upset_administration }
custom_tooltip = liege_dismiss_vizier_interaction.tt.problematic_dismissal.vizier_too_entrenched
}
## Now apply the real effects.
send_interface_toast = {
type = event_toast_effect_neutral
title = liege_dismiss_vizier_interaction.toast.t
left_icon = scope:actor
# Will this have ripple effects (actual)?
if = {
limit = { has_diarchy_active_parameter = primeminister_dismissal_will_upset_administration }
# Apply the modifier, scaling to how much we dun goofed.
add_character_modifier = {
modifier = civil_service_in_chaos_modifier
years = 10
}
}
# End the diarchy.
end_diarchy = yes
}
}
# How badly do they take it?
scope:recipient = {
# Vengeful takes it badly.
if = {
limit = {
has_trait = vengeful
can_set_relation_rival_trigger = { CHARACTER = scope:actor }
}
set_relation_rival = {
target = scope:actor
reason = rival_dismissed_me_from_vizierate
}
add_opinion = {
target = scope:actor
modifier = insult_opinion
opinion = -50
}
}
# Even if they have something stopping them from becoming a rival (e.g., they're already your vizier).
else_if = {
limit = { has_trait = vengeful }
add_opinion = {
target = scope:actor
modifier = insult_opinion
opinion = -50
}
}
# Forgiving isn't mad, they're just disappointed.
else_if = {
limit = { has_trait = forgiving }
add_opinion = {
target = scope:actor
modifier = insult_opinion
opinion = -10
}
}
# Otherwise, a bit of pain is to be expected.
else = {
progress_towards_rival_effect = {
REASON = rival_dismissed_me_from_vizierate
CHARACTER = scope:actor
OPINION = 0
}
# Throw the opinion manually so we can keep the type unified.
add_opinion = {
target = scope:actor
modifier = insult_opinion
opinion = -25
}
}
# Plus some stress.
stress_impact = {
lazy = major_stress_impact_loss
humble = medium_stress_impact_loss
content = medium_stress_impact_loss
diligent = medium_stress_impact_gain
ambitious = major_stress_impact_gain
arrogant = major_stress_impact_gain
}
# Extravagance modifiers taken care of in the on_action.
}
# Plus, remember to advertise to the player that there are alternatives.
## We're deliberately doing this outside of scope:actor so we can make it a lil subtitle rather than something lumped in with the effect block.
## Just give 'em a duchy.
if = {
limit = {
scope:actor = { has_diarchy_active_parameter = primeminister_requires_duchy }
}
custom_tooltip = liege_dismiss_vizier_interaction.tt.problematic_dismissal.bribe.duchy
}
## Just give 'em a county.
else_if = {
limit = {
scope:actor = { has_diarchy_active_parameter = primeminister_requires_county }
}
custom_tooltip = liege_dismiss_vizier_interaction.tt.problematic_dismissal.bribe.county
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_dismviz_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_dismviz_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_dismviz_accept_recipient_list }
}
}
auto_accept = yes
# AI
ai_targets = { ai_recipients = diarch }
ai_frequency = 24
ai_potential = { has_active_diarchy = yes }
ai_will_do = {
# You should actively want to get rid of them.
base = -25
# If you appointed this vizier, don't remove them unless you get booted down to county or something.
modifier = {
add = -500
var:my_vizier ?= scope:recipient
}
# Realm.
## Weight up heavily for counts; they shouldn't generally get them, but they don't want to keep them if they do.
modifier = {
add = 1000
highest_held_title_tier = tier_county
}
## Weight up for dukes.
modifier = {
add = 25
highest_held_title_tier = tier_duchy
}
## Weight down for kings.
modifier = {
add = -25
highest_held_title_tier = tier_kingdom
}
## Weight down for emperors.
modifier = {
add = -50
highest_held_title_tier >= tier_empire
}
## Realm Size.
### Smaller you are, the more likely you are to do this.
### Tiny or less.
modifier = {
add = 50
realm_size <= tiny_realm_size
}
### Minor.
modifier = {
add = 25
realm_size > tiny_realm_size
realm_size <= minor_realm_size
}
### Major.
modifier = {
add = -25
realm_size >= major_realm_size
realm_size < massive_realm_size
}
### Massive or more.
modifier = {
add = -50
realm_size >= massive_realm_size
}
# Traits.
## +++ Ambitious.
modifier = {
add = 25
has_trait = ambitious
}
## +++ Arrogant.
modifier = {
add = 25
has_trait = arrogant
}
## ++ Diligent.
modifier = {
add = 15
has_trait = diligent
}
## ++ Patient.
modifier = {
add = 15
has_trait = patient
}
## + Gregarious.
modifier = {
add = 5
has_trait = gregarious
}
## - Shy.
modifier = {
add = -5
has_trait = shy
}
## - Content.
modifier = {
add = -5
has_trait = content
}
## -- Impatient.
modifier = {
add = -15
has_trait = impatient
}
## -- Content.
modifier = {
add = -15
has_trait = content
}
## -- Humble.
modifier = {
add = -15
has_trait = humble
}
## --- Greedy.
modifier = {
add = -25
has_trait = greedy
}
## --- Lazy.
modifier = {
add = -25
has_trait = lazy
}
}
}
# A vassal requests their liege designate them as regent, should the need arise.
declare_me_regent_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
desc = declare_me_regent_interaction_desc
notification_text = DECLARE_ME_REGENT_PROPOSAL
interface_priority = 20
ai_min_reply_days = 4
ai_max_reply_days = 9
is_shown = {
# The obvious.
NOT = { scope:actor = scope:recipient }
# Only useable on your liege.
scope:recipient = scope:actor.liege
# And said-liege can't be in a regency already...
scope:recipient = { has_active_diarchy = no }
# ... or have declared you their regent already!
scope:actor = { is_designated_diarch = no }
# Can't be used during the Cid story cycle
scope:actor = { NOT = { has_variable = ongoing_cid_story_cycle } }
}
is_valid_showing_failures_only = {
scope:actor = {
# Can't do if you're already expected to be regent.
is_designated_diarch = no
# Can't be too young.
is_adult = yes
# Or imprisoned.
is_imprisoned = no
# Or, for that matter, incapable.
NOT = { has_trait = incapable }
}
# Put a general cooldown on this stuff.
scope:recipient = {
trigger_if = {
limit = {
exists = designated_diarch
}
time_after_diarch_designated = { years >= 10 }
}
}
}
# No general cooldown: if your liege changes, ask away.
# Long specific cooldown, though. We don't want these going through constantly.
cooldown_against_recipient = { years = 10 }
# High cost to reduce spam.
cost = { prestige = 500 }
#Use hook
send_options_exclusive = no
send_option = {
is_valid = {
scope:actor = { has_usable_hook = scope:recipient }
}
flag = hook
localization = GENERIC_SPEND_A_HOOK
}
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
on_accept = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_good
title = declare_me_regent_interaction.tt.success
left_icon = scope:recipient
# Jump the queue to become diarch.
scope:recipient = { designate_diarch = scope:actor }
# This prompts some strife.
change_strife_opinion = major_strife_gain
}
# If you used a hook, calc some extra stuff.
## We move this outside of the toast because we've not got enough room for all this info in there.
if = {
limit = {
scope:hook = yes
has_usable_hook = scope:recipient
}
# Use the hook up.
use_hook = scope:recipient
# Plus scope:recipient is _very_ upset.
reverse_add_opinion = {
target = scope:recipient
modifier = suspicion_opinion
opinion = -20
}
}
}
scope:recipient = {
# Some folks may not be happy.
custom_tooltip = declare_me_regent_interaction.tt.warning.opinions.succession
custom_tooltip = declare_me_regent_interaction.tt.warning.opinions.courtlies
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_desigme_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_desigme_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_desigme_accept_recipient_list }
}
}
on_decline = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_bad
title = declare_me_regent_interaction.tt.failure
left_icon = scope:recipient
# AI lose opinion of their opposite number.
if = {
limit = { is_ai = yes }
add_opinion = {
target = scope:recipient
modifier = insult_opinion
opinion = -40
}
}
# Even trying produces some strife.
change_strife_opinion = medium_strife_gain
}
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_desigme_decline }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_desigme_decline_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_desigme_decline_recipient_list }
}
}
auto_accept = {
scope:recipient = {
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
scope:hook = yes
}
}
}
ai_accept = {
# Try to make it 0 for most interactions
base = -40
# Weight for dislike of current regent.
# Designated regent.
modifier = {
add = {
# Designated diarchs.
if = {
limit = {
designated_diarch ?= {
save_temporary_scope_as = diarch_successor_temp
save_temporary_opinion_value_as = {
name = recipient_opinion_temp
target = scope:diarch_successor_temp
}
}
}
add = scope:recipient_opinion_temp
# Invert to get the true total.
multiply = -1
}
# Expected diarchs.
else_if = {
limit = {
diarchy_successor ?= {
save_temporary_scope_as = diarch_successor_temp
scope:actor = {
save_temporary_opinion_value_as = {
name = recipient_opinion_temp
target = scope:diarch_successor_temp
}
}
}
}
add = scope:recipient_opinion_temp
# Invert to get the true total.
multiply = -1
}
}
desc = declare_me_regent_interaction.tt.opinion_of_current_regent
}
# Opinion of scope:actor.
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = 0.5
}
# Personality.
ai_value_modifier = {
# Meek characters are more likely to accept this.
ai_boldness = -0.5
# Characters with low energy just want to avoid all this planning.
ai_energy = -0.25
}
# Familial closeness.
## Close family get a decent boost.
modifier = {
add = 30
desc = declare_me_regent_interaction.tt.actor_is.close_family
is_close_family_of = scope:actor
# Make sure this isn't cancelled out by the incumbent sharing the relation.
diarchy_successor = {
NOT = {
is_close_family_of = scope:recipient
}
}
}
## Extended family get a minor boost.
modifier = {
add = 20
desc = declare_me_regent_interaction.tt.actor_is.extended_family
is_extended_family_of = scope:actor
# Make sure this isn't cancelled out by the incumbent sharing the relation.
diarchy_successor = {
NOT = {
is_extended_family_of = scope:recipient
}
}
}
## House members get a slight boost.
modifier = {
add = 10
desc = declare_me_regent_interaction.tt.actor_is.house_member
house = scope:actor.house
NOT = {
is_close_or_extended_family_of = scope:actor
}
# Make sure this isn't cancelled out by the incumbent sharing the relation.
diarchy_successor = {
NOT = {
house = scope:recipient.house
}
}
}
# Relationships.
## Positive.
modifier = {
add = 25
desc = declare_me_regent_interaction.tt.actor_is.positive_relationship
has_any_good_relationship_with_character_trigger = { CHARACTER = scope:actor }
# We don't factor for this in the designated/expected diarch 'cause the matrix of overlap'd be hellish.
}
## Negative.
modifier = {
add = -25
desc = declare_me_regent_interaction.tt.actor_is.negative_relationship
has_any_bad_relationship_with_character_trigger = { CHARACTER = scope:actor }
# We don't factor for this in the designated/expected diarch 'cause the matrix of overlap'd be hellish.
}
# Succession score is a direct factor.
modifier = {
add = scope:actor.diarchy_regent_succession_score_value
desc = declare_me_regent_interaction.tt.actor_is.succession_score
}
}
# AI
ai_targets = { ai_recipients = liege }
ai_frequency = 150
ai_potential = {
# Turning off for the AI for the moment due to not being able to display who you'll offend if you do it.
## Should otherwise work and can be turned back on again if wished.
always = no
# Some traits lock the AI out.
## Calc these first 'cause they're cheaper.
NOR = {
has_trait = lazy
has_trait = humble
has_trait = content
}
OR = {
# Driven by traits or personality.
has_trait = arrogant
has_trait = ambitious
# Family think themselves worthy.
any_close_or_extended_family_member = { this = liege }
}
}
ai_will_do = {
# Most AI think this is audacious.
base = 0
# Weight for personality.
## Both modifier.
ai_value_modifier = {
# Bold, energetic characters fancy the gig.
ai_boldness = 0.5
ai_energy = 0.5
}
## And traits!
### These are balanced differently to the other interactions, so it's deliberate that they're not using the @values here.
### +++ Ambitious.
modifier = {
add = 15
has_trait = ambitious
}
### ++ Arrogant.
modifier = {
add = 10
has_trait = arrogant
}
### + Diligent.
modifier = {
add = 5
has_trait = diligent
}
### + Loyal.
modifier = {
add = 5
has_trait = loyal
}
### - Humble.
modifier = {
add = -5
has_trait = humble
}
### --- Content.
modifier = {
add = -15
has_trait = content
}
### --- Lazy.
modifier = {
add = -15
has_trait = lazy
}
# Weight by proximity to the ruler: close family, spouses, etc.
modifier = {
add = 25
OR = {
any_close_or_extended_family_member = { this = scope:recipient }
any_spouse = { this = scope:recipient }
}
}
# Councillors have ambitions.
modifier = {
add = 25
is_councillor = yes
}
# Weight for opinion of current regent.
modifier = {
add = {
scope:recipient = {
# Designated diarchs.
if = {
limit = {
designated_diarch ?= {
save_temporary_scope_as = diarch_successor_temp
scope:actor = {
save_temporary_opinion_value_as = {
name = actor_opinion_temp
target = scope:diarch_successor_temp
}
}
}
}
add = scope:actor_opinion_temp
# Invert to get the true total.
multiply = -1
}
# Expected diarchs.
else_if = {
limit = {
diarchy_successor ?= {
save_temporary_scope_as = diarch_successor_temp
scope:actor = {
save_temporary_opinion_value_as = {
name = actor_opinion_temp
target = scope:diarch_successor_temp
}
}
}
}
add = scope:actor_opinion_temp
# Invert to get the true total.
multiply = -1
}
}
}
always = yes
}
# The AI will only use a Hook if they couldn't otherwise do this
modifier = {
scope:hook = yes
add = -1
}
}
}
# Liege (actor) selects a vizier to help them run the realm.
appoint_vizier_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
desc = appoint_vizier_interaction_desc
interface_priority = 20
is_shown = {
scope:actor = {
# Must be able to retain a vizier.
government_has_flag = may_appoint_viziers
# Plus obscure the interaction if we've already got one, else it's annoyingly redundant.
NOT = { has_diarchy_active_parameter = diarchy_is_vizierate }
}
# We perform this upon ourselves or our (probable) candidates.
scope:recipient = {
OR = {
this = scope:actor
is_courtier_of = scope:actor
AND = {
highest_held_title_tier = tier_barony
liege = scope:actor
}
}
}
}
is_valid_showing_failures_only = {
# You can't already be in a diarchy of any kind.
scope:actor = {
has_active_diarchy = no
}
# Must be of a decent tier.
custom_tooltip = {
text = appoint_vizier_interaction.tt.duchy_or_more
scope:actor.highest_held_title_tier >= tier_duchy
}
# Plus the usuals.
scope:actor = { is_available_at_peace = yes }
# And can't have put the realm into turmoil over this recently.
scope:actor = {
NOT = { has_character_modifier = civil_service_in_chaos_modifier }
}
}
cooldown = { years = 5 }
populate_recipient_list = { sort_vizier_candidates_to_list_effect = yes }
cost = {
prestige = major_prestige_value
renown = {
if = {
limit = {
exists = scope:secondary_recipient
exists = scope:actor.house
scope:secondary_recipient.house ?= scope:actor.house
}
add = massive_dynasty_prestige_value
}
}
}
auto_accept = yes
pre_auto_accept = {
# If we're an AI, set the secondary_recipient up for us.
scope:actor = {
if = {
limit = { is_ai = yes }
# First, we need to calc who _is_ most qualified; we don't have access to the character list any more, so reassemble it.
sort_vizier_candidates_to_list_effect = yes
# Now, parse through the list to find the best character.
ordered_in_list = {
list = characters
order_by = diarchy_vizier_succession_score_value
save_scope_as = ai_recipient
}
}
}
}
on_accept = {
scope:actor = {
# We enter into a vizierate with scope:secondary_recipient.
custom_tooltip = {
text = appoint_vizier_interaction.tt.enter_vizierate_with_secondary_recipient
start_diarchy = vizierate
# The player uses scope:secondary_recipient.
if = {
limit = {
# We use a NOT here rather than is_ai = no because the AI was occasionally managing to bork its selection process, and the title does _not_ like setting an empty diarch, so we fallback AI who can't behave to a sub-optimal choice.
NOT = { exists = scope:ai_recipient }
}
set_diarch = scope:secondary_recipient
}
# Whereas the AI grabs their pre-selected candidate.
else = {
set_diarch = scope:ai_recipient
}
}
# Apply opinion.
## AI.
if = {
limit = { exists = scope:ai_recipient }
scope:ai_recipient = {
add_opinion = {
target = scope:actor
modifier = compliment_opinion
opinion = 30
}
stress_impact = {
ambitious = minor_stress_impact_loss
arrogant = minor_stress_impact_loss
lazy = major_stress_impact_gain
}
}
}
## Player.
else = {
scope:secondary_recipient = {
add_opinion = {
target = scope:actor
modifier = compliment_opinion
opinion = 30
}
stress_impact = {
ambitious = minor_stress_impact_loss
arrogant = minor_stress_impact_loss
lazy = major_stress_impact_gain
}
}
}
# And get X tax jurisdictions.
custom_tooltip = appoint_vizier_interaction.tt.secondary_recipient_grants_tax_jurisdictions
# If scope:secondary_recipient isn't the most qualified candidate, we'll take a scaling negative stewardship modifier.
## The AI will always pick the highest scoring character, so we only do this for players - lock it off so we're not doing lots of unnecessary calculating.
if = {
limit = { is_ai = no }
# First, we need to calc who _is_ most qualified; we don't have access to the character list any more, so reassemble it.
sort_vizier_candidates_to_list_effect = yes
# Now, parse through the list to find the best character.
ordered_in_list = {
list = characters
order_by = diarchy_vizier_succession_score_value
save_scope_as = best_candidate
}
# Is our chap _the_ chap?
if = {
limit = {
NOT = { scope:secondary_recipient = scope:best_candidate }
}
# Ok, now display some warnings.
custom_tooltip = appoint_vizier_interaction.tt.secondary_recipient_is_not_best_candidate
add_character_modifier = {
modifier = civil_service_upset_modifier
years = 10
}
}
}
# Are they of our house?
if = {
limit = {
exists = scope:secondary_recipient.house
house ?= scope:secondary_recipient.house
}
custom_tooltip = appoint_vizier_interaction.tt.same_house_penalty
}
# If we have a designated diarch (and it's not this guy), then they're annoyed.
designated_diarch ?= {
if = {
limit = {
NOT = { this = scope:secondary_recipient }
}
add_opinion = {
target = scope:actor
modifier = appointed_vizier_over_designated_regent_opinion
opinion = -40
}
}
}
# Set a reminder that we appointed this vizier — the AI'll use this to help with determining whether they should remove them or not.
set_variable = {
name = my_vizier
value = scope:recipient
}
# Finally, let's do some stress.
stress_impact = {
trusting = massive_stress_impact_loss
lazy = major_stress_impact_loss
paranoid = minor_stress_impact_gain
diligent = minor_stress_impact_gain
}
}
# Notify about council problemos.
scope:secondary_recipient = {
if = {
limit = { is_councillor = yes }
custom_tooltip = appoint_vizier_interaction.tt.warning.vizier_replace_councillor
}
}
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_appviz_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appviz_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appviz_accept_recipient_list }
}
}
# AI
ai_targets = { ai_recipients = self }
ai_frequency = 240
ai_potential = {
government_has_flag = may_appoint_viziers
}
ai_will_do = {
base = 0
# Realm.
## Weight up for kings.
modifier = {
add = 50
highest_held_title_tier = tier_kingdom
}
## Weight up for emperors.
modifier = {
add = 75
highest_held_title_tier >= tier_empire
}
## Add realm size directly.
modifier = {
add = sub_realm_size
is_landed = yes
}
# Traits.
## +++ Lazy.
modifier = {
add = 25
has_trait = lazy
}
## +++ Greedy.
modifier = {
add = 25
has_trait = greedy
}
## ++ Humble.
modifier = {
add = 15
has_trait = humble
}
## ++ Content.
modifier = {
add = 15
has_trait = content
}
## ++ Impatient.
modifier = {
add = 15
has_trait = impatient
}
## + Content.
modifier = {
add = 5
has_trait = content
}
## + Shy.
modifier = {
add = 5
has_trait = shy
}
## - Gregarious.
modifier = {
add = -5
has_trait = gregarious
}
## -- Patient.
modifier = {
add = -15
has_trait = patient
}
## -- Diligent.
modifier = {
add = -15
has_trait = diligent
}
## --- Arrogant.
modifier = {
add = -25
has_trait = arrogant
}
## --- Ambitious.
modifier = {
add = -25
has_trait = ambitious
}
}
}
# Liege (actor) selects a junior emperor to be their heir.
appoint_junior_emperor_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
redirect = {
scope:recipient = { save_scope_as = secondary_recipient }
if = {
limit = { scope:secondary_recipient = scope:actor }
clear_saved_scope = secondary_recipient
}
if = {
limit = {
NOT = {
scope:secondary_recipient ?= { valid_junior_emperor_candidate_trigger = { LIEGE = scope:actor } }
}
}
clear_saved_scope = secondary_recipient
}
}
desc = appoint_junior_emperor_interaction_desc
interface_priority = 20
is_shown = {
# Must be able to retain a co-emperor.
scope:actor = { may_appoint_co_emperors_trigger = yes }
# We perform this upon ourselves or our (probable) candidates.
OR = {
scope:recipient ?= scope:actor
scope:secondary_recipient ?= { valid_junior_emperor_candidate_trigger = { LIEGE = scope:actor } }
}
}
is_valid_showing_failures_only = {
# You can't already be in a diarchy of any kind.
scope:actor = {
has_active_diarchy = no
}
# Make sure we're targeting the right people, since redirects make this a lil slippery.
trigger_if = {
limit = { exists = scope:secondary_recipient }
scope:secondary_recipient = { valid_junior_emperor_candidate_trigger = { LIEGE = scope:actor } }
}
# Plus the usuals.
scope:actor = { is_available_at_peace = yes }
}
populate_recipient_list = { sort_junior_emperor_candidates_to_list_effect = yes }
cost = {
prestige = designate_heir_admin_prestige_cost
influence = designate_heir_admin_influence_cost
}
auto_accept = yes
pre_auto_accept = {
# If we're an AI, set the secondary_recipient up for us.
scope:actor = {
if = {
limit = { is_ai = yes }
# First, we need to calc who _is_ most qualified; we don't have access to the character list any more, so reassemble it.
sort_junior_emperor_candidates_to_list_effect = yes
# Now, parse through the list to find the best character.
## And by that I mean play literal favourites.
ordered_in_list = {
list = characters
order_by = "reverse_opinion(scope:actor)"
save_scope_as = ai_recipient
}
}
}
}
on_accept = {
scope:actor = {
# We enter into a junior emperorship with scope:secondary_recipient.
## The player uses scope:secondary_recipient.
if = {
limit = {
# We use a NOT here rather than is_ai = no because the AI was occasionally managing to bork its selection process, and the title does _not_ like setting an empty diarch, so we fallback AI who can't behave to a sub-optimal choice.
NOT = { exists = scope:ai_recipient }
}
custom_tooltip = {
text = appoint_junior_emperor_interaction.tt.enter_junior_emperorship_with_secondary_recipient
start_diarchy = junior_emperorship
set_diarch = scope:secondary_recipient
}
# We set them to be our designated heir.
## & if we already have an heir, warn that this overwrites it.
designated_heir ?= {
if = {
limit = { this != scope:secondary_recipient }
custom_tooltip = appoint_junior_emperor_interaction.tt.overwrite_designated_heir
# Nab them for use further on.
save_scope_as = old_heir
}
}
## Designate and inform.
set_designated_heir = scope:secondary_recipient
}
## Whereas the AI grabs their pre-selected candidate.
else = {
start_diarchy = junior_emperorship
set_diarch = scope:ai_recipient
# We set them to be our designated heir.
## First grabbing the old one for opinions.
designated_heir ?= {
if = {
limit = { this != scope:ai_recipient }
# Nab them for use further on.
save_scope_as = old_heir
}
}
## Then overwriting.
set_designated_heir = scope:ai_recipient
}
}
# And remember who appointed them on scope:recipient.
grateful_for_appointment_as_co_emperor_effect = yes
# Your designated heir is _very_ pissed.
diarch_overwrites_old_designated_heir_apply_opinions_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Your designated regent is also unhappy (probably).
designated_diarch_overwridden_by_co_ruler_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Make sure we have our co-ruler directly with us.
## Courtiers are given to us immediately.
if = {
limit = {
scope:secondary_recipient = { is_ruler = no }
}
scope:actor = { add_courtier = scope:secondary_recipient }
}
## Vassals are retracted.
if = {
limit = { scope:secondary_recipient.liege != scope:actor }
scope:secondary_recipient.liege = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
scope:secondary_recipient.liege = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
create_title_and_vassal_change = {
type = revoked
save_scope_as = change
}
scope:secondary_recipient = {
change_liege = {
liege = scope:actor
change = scope:change
}
}
resolve_title_and_vassal_change = scope:change
}
#TODO_CD_EP3_POLISH; notification event for the relevant parties if they're players.
#TODO_CD_EP3_POLISH; memories for those involved, plus probably a rivalry reason with at least designated heirs.
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_appjunemp_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appjunemp_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appjunemp_accept_recipient_list }
}
}
# AI
ai_targets = { ai_recipients = children }
ai_frequency = 60
ai_potential = {
# Filter us down nice'n'tight.
may_appoint_co_emperors_trigger = yes
# Plus rule out any diarchies already on the go.
has_active_diarchy = no
# Aaaand finally, the AI won't do this unless they're considering their age and they've got no adult kids.
age >= 50
any_child = {
count = all
is_adult = no
}
}
ai_will_do = {
# The AI doesn't like doing this without good reason.
base = -100
ai_wants_junior_or_co_emperor_modifier = yes
}
}
# Liege (actor) selects a co-emperor to be their heir/influence farming stooge.
appoint_co_emperor_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
redirect = {
scope:recipient = { save_scope_as = secondary_recipient }
if = {
limit = { scope:secondary_recipient ?= scope:actor }
clear_saved_scope = secondary_recipient
}
if = {
limit = {
NOT = {
scope:secondary_recipient ?= {
valid_co_emperor_candidate_trigger = { LIEGE = scope:actor }
}
}
}
clear_saved_scope = secondary_recipient
}
}
desc = appoint_co_emperor_interaction_desc
interface_priority = 280
is_shown = {
# Must be able to retain a co-emperor.
scope:actor = { may_appoint_co_emperors_trigger = yes }
# We perform this upon ourselves or our (probable) candidates.
OR = {
scope:recipient ?= scope:actor
scope:secondary_recipient ?= {
valid_co_emperor_candidate_trigger = { LIEGE = scope:actor }
}
}
}
is_valid_showing_failures_only = {
# You can't already be in a diarchy of any kind.
scope:actor = {
has_active_diarchy = no
}
# Make sure we're targeting the right people, since redirects make this a lil slippery.
trigger_if = {
limit = { exists = scope:secondary_recipient }
scope:secondary_recipient = {
valid_co_emperor_candidate_trigger = { LIEGE = scope:actor }
}
}
# Plus the usuals.
scope:actor = { is_available_at_peace = yes }
}
populate_recipient_list = { sort_co_emperor_candidates_to_list_effect = yes }
cost = {
prestige = designate_heir_admin_prestige_cost
influence = designate_heir_admin_influence_cost
}
auto_accept = yes
pre_auto_accept = {
# If we're an AI, set the secondary_recipient up for us.
scope:actor = {
if = {
limit = { is_ai = yes }
# First, we need to calc who _is_ most qualified; we don't have access to the character list any more, so reassemble it.
sort_co_emperor_candidates_to_list_effect = yes
# Now, parse through the list to find the best character.
## And by that I mean play literal favourites.
ordered_in_list = {
list = characters
order_by = {
value = "reverse_opinion(scope:actor)"
# Boost up anyone we're related to by blood or marriage.
if = {
limit = {
OR = {
is_close_or_extended_family_of = scope:actor
house ?= scope:actor.house
any_spouse = { is_close_or_extended_family_of = scope:actor }
}
}
# This means we should _generally_ prefer people who are in with the imperial family, but if we hate them then we boot them down the list even further.
multiply = 10
}
}
save_scope_as = ai_recipient
}
}
}
}
on_accept = {
scope:actor = {
# We enter into a co-emperorship with scope:secondary_recipient.
## The player uses scope:secondary_recipient.
if = {
limit = {
# We use a NOT here rather than is_ai = no because the AI was occasionally managing to bork its selection process, and the title does _not_ like setting an empty diarch, so we fallback AI who can't behave to a sub-optimal choice.
NOT = { exists = scope:ai_recipient }
}
custom_tooltip = {
text = appoint_co_emperor_interaction.tt.enter_co_emperorship_with_secondary_recipient
start_diarchy = co_emperorship
set_diarch = scope:secondary_recipient
}
# If appropriate, we set them to be our designated heir.
if = {
limit = {
scope:secondary_recipient = {
is_close_or_extended_family_of = scope:actor
house ?= scope:actor.house
}
}
# & if we already have an heir, warn that this overwrites it.
designated_heir ?= {
if = {
limit = { this != scope:secondary_recipient }
custom_tooltip = appoint_co_emperor_interaction.tt.overwrite_designated_heir
# Nab them for use further on.
save_scope_as = old_heir
}
}
# Designate and inform.
set_designated_heir = scope:secondary_recipient
}
}
## Whereas the AI grabs their pre-selected candidate.
else = {
start_diarchy = co_emperorship
set_diarch = scope:ai_recipient
# If appropriate, we set them to be our designated heir.
if = {
limit = {
scope:secondary_recipient = {
is_close_or_extended_family_of = scope:actor
house ?= scope:actor.house
}
}
# First grabbing the old one for opinions.
designated_heir ?= {
if = {
limit = { this != scope:secondary_recipient }
# Nab them for use further on.
save_scope_as = old_heir
}
}
# Then overwriting.
set_designated_heir = scope:ai_recipient
}
}
}
# And remember who appointed them on scope:recipient.
grateful_for_appointment_as_co_emperor_effect = yes
# Your designated heir is _very_ pissed.
diarch_overwrites_old_designated_heir_apply_opinions_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Your designated regent is also unhappy (probably).
designated_diarch_overwridden_by_co_ruler_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Make sure we have our co-ruler directly with us.
## Courtiers are given to us immediately.
if = {
limit = {
scope:secondary_recipient = { is_ruler = no }
}
scope:actor = { add_courtier = scope:secondary_recipient }
}
## Vassals are retracted.
if = {
limit = { scope:secondary_recipient.liege != scope:actor }
scope:secondary_recipient.liege = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
create_title_and_vassal_change = {
type = revoked
save_scope_as = change
}
scope:secondary_recipient = {
change_liege = {
liege = scope:actor
change = scope:change
}
}
resolve_title_and_vassal_change = scope:change
}
#TODO_CD_EP3_POLISH; notification event for the relevant parties if they're players.
#TODO_CD_EP3_POLISH; memories for those involved, plus probably a rivalry reason with at least designated heirs.
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_appcoemp_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appcoemp_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appcoemp_accept_recipient_list }
}
}
# AI
ai_targets = { ai_recipients = children }
ai_targets = { ai_recipients = vassals }
ai_frequency = 60
ai_potential = {
# Filter us down nice'n'tight.
may_appoint_co_emperors_trigger = yes
# Plus rule out any diarchies already on the go.
has_active_diarchy = no
# Aaaand finally, the AI won't do this unless they're considering their age and they've got adult kids.
age >= 50
any_child = { is_adult = yes }
}
ai_will_do = {
# The AI doesn't like doing this without good reason.
base = -100
ai_wants_junior_or_co_emperor_modifier = yes
}
}
# Liege (actor) selects one of their children to be their heir & diarch.
appoint_co_monarch_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
redirect = {
scope:recipient = { save_scope_as = secondary_recipient }
if = {
limit = { scope:secondary_recipient ?= scope:actor }
clear_saved_scope = secondary_recipient
}
if = {
limit = {
NOT = {
scope:secondary_recipient ?= { is_child_of = scope:actor }
}
}
clear_saved_scope = secondary_recipient
}
}
desc = appoint_co_monarch_interaction_desc
interface_priority = 20
is_shown = {
# Must be able to retain a co-emperor.
scope:actor = { may_appoint_co_monarchs_trigger = yes }
# We perform this upon ourselves or our (probable) candidates.
OR = {
scope:recipient ?= scope:actor
scope:secondary_recipient ?= { is_child_of = scope:actor }
}
}
is_valid_showing_failures_only = {
# You can't already be in a diarchy of any kind.
scope:actor = {
has_active_diarchy = no
}
# Make sure we're targeting the right people, since redirects make this a lil slippery.
trigger_if = {
limit = { exists = scope:secondary_recipient }
scope:secondary_recipient = { valid_co_monarch_candidate_trigger = { LIEGE = scope:actor } }
}
# Plus the usuals.
scope:actor = { is_available_at_peace = yes }
}
populate_recipient_list = { sort_co_monarch_candidates_to_list_effect = yes }
cost = {
prestige = {
value = designate_heir_cost
# Discount it because this _is_ worse than the standard path.
multiply = 0.5
}
}
auto_accept = yes
pre_auto_accept = {
# If we're an AI, set the secondary_recipient up for us.
scope:actor = {
if = {
limit = { is_ai = yes }
# First, we need to calc who _is_ most qualified; we don't have access to the character list any more, so reassemble it.
sort_co_monarch_candidates_to_list_effect = yes
# Now, parse through the list to find the best character.
## And by that I mean play literal favourites.
ordered_in_list = {
list = characters
limit = { valid_co_monarch_candidate_trigger = { LIEGE = scope:actor } }
order_by = "reverse_opinion(scope:actor)"
save_scope_as = ai_recipient
}
}
}
}
on_accept = {
scope:actor = {
# We enter into a co-emperorship with scope:secondary_recipient.
## The player uses scope:secondary_recipient.
if = {
limit = {
# We use a NOT here rather than is_ai = no because the AI was occasionally managing to bork its selection process, and the title does _not_ like setting an empty diarch, so we fallback AI who can't behave to a sub-optimal choice.
NOT = { exists = scope:ai_recipient }
}
custom_tooltip = {
text = appoint_co_monarch_interaction.tt.enter_co_monarchy_with_secondary_recipient
start_diarchy = co_monarchy
set_diarch = scope:secondary_recipient
}
# We set them to be our designated heir.
## & if we already have an heir, warn that this overwrites it.
designated_heir ?= {
if = {
limit = { this != scope:secondary_recipient }
custom_tooltip = appoint_co_monarch_interaction.tt.overwrite_designated_heir
# Nab them for use further on.
save_scope_as = old_heir
}
}
## Designate and inform.
set_designated_heir = scope:secondary_recipient
}
## Whereas the AI grabs their pre-selected candidate.
else = {
start_diarchy = co_emperorship
set_diarch = scope:ai_recipient
# We set them to be our designated heir.
## First grabbing the old one for opinions.
designated_heir ?= {
if = {
limit = { this != scope:secondary_recipient }
# Nab them for use further on.
save_scope_as = old_heir
}
}
## Then overwriting.
set_designated_heir = scope:ai_recipient
}
}
# And remember who appointed them on scope:recipient.
grateful_for_appointment_as_co_emperor_effect = yes
# Your designated heir is _very_ pissed.
diarch_overwrites_old_designated_heir_apply_opinions_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Your designated regent is also unhappy (probably).
designated_diarch_overwridden_by_co_ruler_effect = {
LIEGE = scope:actor
CO_RULER = scope:secondary_recipient
}
# Make sure we have our co-ruler directly with us.
## Courtiers are given to us immediately.
if = {
limit = {
scope:secondary_recipient = { is_ruler = no }
}
scope:actor = { add_courtier = scope:secondary_recipient }
}
## Vassals are retracted.
if = {
limit = { scope:secondary_recipient.liege != scope:actor }
scope:secondary_recipient.liege = {
add_opinion = {
target = scope:actor
modifier = retracted_vassal
}
}
create_title_and_vassal_change = {
type = revoked
save_scope_as = change
}
scope:secondary_recipient = {
change_liege = {
liege = scope:actor
change = scope:change
}
}
resolve_title_and_vassal_change = scope:change
}
#TODO_CD_EP3_POLISH; notification event for the relevant parties if they're players.
#TODO_CD_EP3_POLISH; memories for those involved, plus probably a rivalry reason with at least designated heirs.
# Object explorer logging.
scope:actor = {
diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_appcomon_accept }
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appcomon_accept_actor_list }
}
scope:recipient = {
diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_appcomon_accept_recipient_list }
}
}
# AI
ai_targets = { ai_recipients = children }
ai_frequency = 120
ai_potential = {
# Filter us down nice'n'tight.
may_appoint_co_monarchs_trigger = yes
# Plus rule out any diarchies already on the go.
has_active_diarchy = no
# Aaaand finally, the AI won't do this unless they're considering their age and they've got adult kids.
age >= 50
any_child = { is_adult = yes }
}
ai_will_do = {
# The AI doesn't like doing this without good reason.
base = -100
ai_wants_junior_or_co_emperor_modifier = yes
}
}
# Start a scheme to replace an incumbent regent.
overthrow_regent_scheme_interaction = {
category = interaction_category_diarch
icon = icon_declare_me_regent
ignores_pending_interaction_block = yes
scheme = overthrow_regent
desc = overthrow_regent_scheme_interaction_desc
interface_priority = 20
is_shown = {
# Standard setup.
scope:actor.liege ?= {
has_active_diarchy = yes
# You can't overthrow non-regencies. At least not this way.
has_diarchy_parameter = diarchy_is_regency
}
scope:recipient = {
NOT = { this = scope:actor }
liege ?= {
this = scope:actor.liege
diarch ?= scope:recipient
NOT = { this = scope:actor }
}
}
}
is_valid_showing_failures_only = {
# Make sure you wouldn't just cop out immediately.
## Disabling is fine, FWIW. You'll de-disable with time.
scope:actor = { is_diarch_valid_trigger = yes }
# Have we been vetoed from succession due to politicking?
custom_tooltip = {
text = overthrow_regent_scheme_interaction.tt.filtered_due_to_incumbent_politicking
NOT = { scope:actor.var:diarch_succession_filtered_due_to_incumbents_politicking ?= scope:recipient }
}
}
# Long specific cooldown. If you give up, you should give it a rest 'less things change.
cooldown_against_recipient = { years = 10 }
# Scheme Starter Packages
options_heading = schemes.t.agent_packages
send_options_exclusive = yes
## Balanced agents.
send_option = {
flag = agent_focus_balance
current_description = overthrow_regent_scheme_interaction.tt.agent_focus_balance
}
## Focused on Success Chance.
send_option = {
flag = agent_focus_success
current_description = overthrow_regent_scheme_interaction.tt.agent_focus_success
}
## Focused on Speed.
send_option = {
flag = agent_focus_speed
current_description = overthrow_regent_scheme_interaction.tt.agent_focus_speed
}
## Focused on Secrecy.
send_option = {
flag = agent_focus_secrecy
current_description = overthrow_regent_scheme_interaction.tt.agent_focus_secrecy
}
on_accept = {
scope:actor = {
# Sort some stress stuff.
overthrow_regent_scheme_interaction_actor_stress_effect = yes
# And some feedback for starting.
send_interface_toast = {
type = event_toast_effect_neutral
title = overthrow_regent_scheme_interaction.tt.started_scheme
left_icon = scope:actor
right_icon = scope:recipient
# Success.
if = {
limit = { scope:agent_focus_success ?= yes }
begin_scheme_with_agents_effect = {
SCHEME_TYPE = overthrow_regent
TARGET_TYPE = target_character
TARGET_SCOPE = scope:recipient
# Success.
AGENT_1 = agent_thug
AGENT_2 = agent_ambusher
AGENT_3 = agent_muscle
# Speed.
AGENT_4 = agent_footpad
# Secrecy.
AGENT_5 = agent_lookout
}
}
# Speed.
else_if = {
limit = { scope:agent_focus_speed ?= yes }
begin_scheme_with_agents_effect = {
SCHEME_TYPE = overthrow_regent
TARGET_TYPE = target_character
TARGET_SCOPE = scope:recipient
# Speed.
AGENT_1 = agent_footpad
AGENT_2 = agent_tracker
AGENT_3 = agent_planner
# Success.
AGENT_4 = agent_thug
# Secrecy.
AGENT_5 = agent_lookout
}
}
# Secrecy.
else_if = {
limit = { scope:agent_focus_secrecy ?= yes }
begin_scheme_with_agents_effect = {
SCHEME_TYPE = overthrow_regent
TARGET_TYPE = target_character
TARGET_SCOPE = scope:recipient
# Secrecy.
AGENT_1 = agent_lookout
AGENT_2 = agent_lookout
AGENT_3 = agent_decoy
# Success.
AGENT_4 = agent_thug
# Speed.
AGENT_5 = agent_footpad
}
}
# Balanced.
else = {
begin_scheme_with_agents_effect = {
SCHEME_TYPE = overthrow_regent
TARGET_TYPE = target_character
TARGET_SCOPE = scope:recipient
# Success.
AGENT_1 = agent_thug
AGENT_2 = agent_ambusher
# Speed.
AGENT_3 = agent_footpad
AGENT_4 = agent_planner
# Secrecy.
AGENT_5 = agent_lookout
}
}
}
}
}
auto_accept = yes
# AI
ai_targets = {
ai_recipients = peer_vassals
ai_recipients = scripted_relations
}
ai_frequency = 60
ai_potential = {
# Some traits lock the AI out.
## Calc these first 'cause they're cheaper.
NOR = {
has_trait = lazy
has_trait = humble
has_trait = content
}
OR = {
# Driven by traits or personality.
has_trait = arrogant
has_trait = ambitious
# Family think themselves worthy.
any_close_or_extended_family_member = { this = liege }
# If you're rivals with the current regent, that's a good cause.
any_relation = {
type = rival
is_diarch_of_target = root.liege
}
}
}
ai_will_do = {
# Most AI think this is audacious.
base = -50
# Opinion Factor
opinion_modifier = {
opinion_target = scope:recipient
multiplier = -1
}
# Weight for personality.
## Both modifier.
ai_value_modifier = {
# Bold, energetic characters fancy the gig.
ai_boldness = 0.5
ai_energy = 0.5
}
## And traits!
### These are balanced differently to the other interactions, so it's deliberate that they're not using the @values here.
### +++ Loyal (if current regent is disloyal).
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = loyal
exists = liege
scope:recipient = { diarch_loyalty <= diarch_loyalty_visibly_disloyal_threshold }
diarch_loyalty_score_type_regency_value >= diarch_loyalty_visibly_loyal_threshold
}
### +++ Disloyal (if current regent is loyal).
modifier = {
add = diarch_ai_desire_plus_3_value
has_trait = disloyal
exists = liege
scope:recipient = { diarch_loyalty >= diarch_loyalty_visibly_loyal_threshold }
diarch_loyalty_score_type_regency_value >= diarch_loyalty_visibly_disloyal_threshold
}
### ++ Ambitious.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = ambitious
}
### ++ Arrogant.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = arrogant
}
### ++ Deceitful.
modifier = {
add = diarch_ai_desire_plus_2_value
has_trait = deceitful
}
### + Diligent.
modifier = {
add = diarch_ai_desire_plus_1_value
has_trait = diligent
}
### - Lazy.
modifier = {
add = diarch_ai_desire_minus_1_value
has_trait = lazy
}
### -- Honest.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = honest
}
### -- Humble.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = humble
}
### -- Content.
modifier = {
add = diarch_ai_desire_minus_2_value
has_trait = content
}
### --- Disloyal (if current regent is disloyal).
modifier = {
add = diarch_ai_desire_minus_3_value
has_trait = disloyal
exists = liege
scope:recipient = { diarch_loyalty <= diarch_loyalty_visibly_disloyal_threshold }
diarch_loyalty_score_type_regency_value <= diarch_loyalty_visibly_disloyal_threshold
}
### --- Loyal (if current regent is loyal).
#### Also some loyal-adjacent traits that would otherwise cause stress.
modifier = {
add = diarch_ai_desire_minus_3_value
OR = {
has_trait = loyal
has_trait = honest
has_trait = compassionate
has_trait = just
}
exists = liege
scope:recipient = { diarch_loyalty >= diarch_loyalty_visibly_loyal_threshold }
diarch_loyalty_score_type_regency_value >= diarch_loyalty_visibly_loyal_threshold
}
# Weight by proximity to the ruler: close family, spouses, etc.
modifier = {
add = diarch_ai_desire_plus_2_value
exists = scope:recipient.liege
OR = {
any_close_or_extended_family_member = { this = scope:recipient.liege }
any_spouse = { this = scope:recipient.liege }
}
}
# Councillors have ambitions.
modifier = {
add = diarch_ai_desire_plus_2_value
is_councillor = yes
}
# Factors.
## If relations are near-perfect, we don't want to go plotting, as it'll look weird.
modifier = {
factor = 0
OR = {
has_any_good_relationship_with_character_trigger = { CHARACTER = scope:recipient }
opinion = {
target = scope:recipient
value >= very_high_positive_opinion
}
}
}
}
}