@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 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. 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 } liege = { has_diarchy_parameter = unlock_diarch_revoke_title_interaction } } # Make sure scope:recipient is suitable. scope:recipient = { # We only target vassals of the liege... liege = scope:actor.liege 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. 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 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_hightier_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_by_tier = { barony = 0 county = 0 duchy = 6 kingdom = 6 empire = 6 hegemony = 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 ai_min_reply_days = 4 ai_max_reply_days = 9 on_decline_summary = diarch_rebel_or_crime_summary.retract is_shown = { # The obvious. 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 } liege = { has_diarchy_parameter = unlock_diarch_retract_vassal_interaction } # 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 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. 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 = { title_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 = { title_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 } } } } } # AI ai_targets = { ai_recipients = peer_vassals } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 24 kingdom = 24 empire = 24 hegemony = 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 ai_min_reply_days = 4 ai_max_reply_days = 9 on_decline_summary = diarch_rebel_or_crime_summary.crominal is_shown = { # The obvious. 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 } liege = { has_diarchy_parameter = unlock_diarch_imprison_interaction } # 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. 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 = scope:actor } } 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 } 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_hightier_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_type = claimant_faction faction_is_at_war = yes 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_recipients = scripted_relations } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 12 kingdom = 12 empire = 12 hegemony = 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. 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 liege = { has_diarchy_parameter = diarch_can_subsidise_liege_authority } } # 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 = { government_allows = administrative } 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_by_tier = { barony = 0 county = 48 duchy = 24 kingdom = 24 empire = 24 hegemony = 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. 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 liege = { has_diarchy_parameter = unlock_adjust_imperial_bureaucracy_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_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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 0 empire = 24 hegemony = 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 is_shown = { # The obvious. 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 } liege = { has_diarchy_parameter = unlock_legal_meddling_interaction } } # Make sure scope:recipient is suitable. scope:recipient = { # We only target vassals of the liege... liege = scope:actor.liege 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_by_tier = { barony = 0 county = 0 duchy = 6 kingdom = 6 empire = 6 hegemony = 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 = { 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.de_jure_liege ?= { this != scope:actor.primary_title.de_jure_liege } } ## 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. 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 } liege = { has_diarchy_parameter = unlock_syphon_treasury_interaction } } # 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 NOT = { government_has_flag = government_is_nomadic } } custom_tooltip = diarch_syphon_treasury_interaction.tt.success.syphon_development_growth } ## Alternatively, herd for nomadic rulers else_if = { limit = { stewardship >= syphon_treasury_stewardship_very_high government_has_flag = government_is_nomadic } custom_tooltip = diarch_syphon_treasury_interaction.tt.success.syphon_herd } ## 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 } } } # Alternatively, for nomadic rulers, we steal some herd else_if = { limit = { scope:actor.stewardship >= syphon_treasury_stewardship_very_high government_has_flag = government_is_nomadic } # Gold transfer was... ## Very high. if = { limit = { always = scope:diarch_syphon_treasury_sum_huge } scope:recipient = { domicile ?= { change_herd = monumental_herd_loss } } } ## High. else_if = { limit = { always = scope:diarch_syphon_treasury_sum_large } scope:recipient = { domicile ?= { change_herd = massive_herd_loss } } } ## Medium. else_if = { limit = { always = scope:diarch_syphon_treasury_sum_medium } scope:recipient = { domicile ?= { change_herd = major_herd_loss } } } ## Low. else = { scope:recipient = { domicile ?= { change_herd = medium_herd_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 = { 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 = { 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 = { 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 = { 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_by_tier = { barony = 0 county = 24 duchy = 12 kingdom = 12 empire = 12 hegemony = 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. 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 } liege = { has_diarchy_parameter = unlock_shift_privileges_interaction } } # Make sure scope:recipient is suitable. scope:recipient = { # We only target vassals of the liege... liege = scope:actor.liege 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 } tgp_activate_catalyst_against_hegemon_effect = { HEGEMON = scope:actor.top_liege CATALYST = catalyst_diarch_mandate } } # Debug logging. debug_log = debug_log.shift_privileges.attempt_made } auto_accept = yes # AI ai_targets = { ai_recipients = peer_vassals } ai_frequency_by_tier = { barony = 0 county = 0 duchy = 6 kingdom = 6 empire = 6 hegemony = 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. 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_by_tier = { barony = 0 county = 48 duchy = 24 kingdom = 24 empire = 24 hegemony = 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. 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 = { title_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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 0 empire = 24 hegemony = 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 = { 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 } } 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_has_powerful_families } } 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 } } tgp_activate_catalyst_against_hegemon_effect = { HEGEMON = scope:actor.top_liege CATALYST = catalyst_diarch_mandate } } } } # 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_by_tier = { barony = 0 county = 0 duchy = 120 kingdom = 120 empire = 120 hegemony = 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 = { tgp_activate_catalyst_against_hegemon_effect = { HEGEMON = scope:actor.top_liege CATALYST = catalyst_diarch_mandate } 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_by_tier = { barony = 0 county = 36 duchy = 12 kingdom = 12 empire = 12 hegemony = 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 = { government_allows = administrative } } AND = { scope:actor.liege ?= scope:recipient scope:recipient = { government_allows = administrative } } } } is_valid = { scope:actor = { government_allows = administrative } # 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 } # Movement Power send_option = { starts_enabled = { exists = scope:actor.var:movement_power_individual scope:actor.var:movement_power_individual >= decent_movement_power_value } is_shown = { scope:actor = { government_has_flag = government_is_celestial is_diarch_of_target = scope:recipient } scope:recipient = { government_has_flag = government_is_celestial } } is_valid = { custom_tooltip = { text = swing_scales_currency_interaction.tt.scales_min_movement_power scope:actor.var:movement_power_individual >= medium_movement_power_value } } flag = swing_movement_power localization = SWING_MOVEMENT_POWER current_description = SWING_MOVEMENT_POWER_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_recipients = diarch } ai_frequency_by_tier = { barony = 0 county = 48 duchy = 24 kingdom = 24 empire = 24 hegemony = 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 = 7 scope:swing_influence = yes } modifier = { add = 6 scope:swing_movement_power = 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 = { government_allows = administrative } } AND = { scope:actor.liege ?= scope:recipient scope:recipient = { government_allows = administrative } } } } is_valid = { scope:actor = { government_allows = administrative } } starts_enabled = { scope:actor.influence >= scope:actor.swing_scales_influence_cost_value } flag = swing_influence localization = SWING_INFLUENCE current_description = SWING_INFLUENCE_DESC } # Movement Power send_option = { starts_enabled = { exists = scope:actor.var:movement_power_individual scope:actor.var:movement_power_individual >= decent_movement_power_value } is_shown = { scope:actor = { government_has_flag = government_is_celestial is_diarch_of_target = scope:recipient } scope:recipient = { government_has_flag = government_is_celestial } } is_valid = { custom_tooltip = { text = swing_scales_currency_interaction.tt.scales_min_movement_power scope:actor.var:movement_power_individual >= medium_movement_power_value } } flag = swing_movement_power localization = SWING_MOVEMENT_POWER current_description = SWING_MOVEMENT_POWER_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_by_tier = { barony = 0 county = 6 duchy = 6 kingdom = 6 empire = 6 hegemony = 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. 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_by_tier = { barony = 0 county = 12 duchy = 6 kingdom = 6 empire = 6 hegemony = 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. 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 = { # 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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 0 empire = 12 hegemony = 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. 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 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 right_icon = scope:recipient # 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_by_tier = { barony = 0 county = 48 duchy = 24 kingdom = 12 empire = 12 hegemony = 12 } 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. 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 Entrenched Regencies. OR = { has_diarchy_parameter = dismissal_requires_gift AND = { has_diarchy_parameter = dismissal_requires_no_ministry tgp_has_access_to_ministry_trigger = no } } } } 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 scope:diarchy_ending_gift_herd = yes } } } custom_tooltip = { text = government_is_celestial_tt scope:actor = { tgp_has_access_to_ministry_trigger = no } } } 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 } 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 } ## Horse. send_option = { flag = diarchy_ending_gift_herd current_description = diarchy_ending_gift_herd_desc is_shown = { # Can only pay herd if actor has herd to pay and recipient accepts herd as a currency scope:actor = { government_has_flag = government_is_nomadic } scope:recipient = { government_has_flag = government_is_nomadic } } } 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 } } } } # Herd if = { limit = { scope:diarchy_ending_gift_herd = yes } # Transfer the cash. scope:actor = { #gold = major_gold_value pay_herd = { target = scope:recipient value = domicile.ten_percent_herd_value } } # Plus they're happy. if = { limit = { is_ai = yes } # More so if they're greedy, 'cause greedy likes money i mean horses. 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 } } } else_if = { limit = { always = scope:diarchy_ending_gift_herd } scope:actor = { diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_herd_accept } diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_herd_accept_actor_list } } scope:recipient = { diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_herd_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 } } } else_if = { limit = { always = scope:diarchy_ending_gift_herd } scope:actor = { diarch_interaction_set_or_update_global_variable_effect = { VARIABLE = di_track_entr_herd_decline } diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_herd_decline_actor_list } } scope:recipient = { diarch_interaction_add_to_global_list_effect = { VARIABLE_LIST = di_track_entr_herd_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 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_by_tier = { barony = 0 county = 48 duchy = 24 kingdom = 12 empire = 12 hegemony = 12 } 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 } ## Herd. modifier = { add = 5 scope:diarchy_ending_gift_herd = 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. 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_by_tier = { barony = 0 county = 120 duchy = 24 kingdom = 24 empire = 24 hegemony = 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 filter_tags = { admin_liege rep_liege } 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. 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 = { trigger_if = { limit = { NOT = { has_diarchy_type = grand_secretariat } } has_active_diarchy = no } trigger_else = { scope:actor = { OR = { has_title = title:e_minister_grand_marshal has_title = title:e_minister_chancellor has_title = title:e_minister_censor } } } } # ... or have declared you their regent already! scope:actor = { is_designated_diarch = no NOR = { is_diarch_of_target = scope:recipient # Can't be used during the Cid story cycle 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 } is_diarch_valid_trigger = yes } # 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 = { if = { limit = { has_diarchy_type = grand_secretariat } if = { limit = { scope:actor = { has_title = title:e_minister_grand_marshal } } add_realm_law = grand_marshal_law } else_if = { limit = { scope:actor = { has_title = title:e_minister_chancellor } } add_realm_law = grand_chancellor_law } else_if = { limit = { scope:actor = { has_title = title:e_minister_censor } } add_realm_law = grand_censor_law } scope:actor = { set_variable = { name = asked_to_be_secretary_director value = yes } } } else = { 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 = { 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 scope:recipient = { NOT = { has_diarchy_type = grand_secretariat } } } # Grand Secretariat modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } scope:actor.top_participant_group:dynastic_cycle ?= { exists = var:movement_favored } desc = diarch_candidate_score.grand_secretariat.favored_value add = 20 } modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } scope:actor = { is_any_movement_leader = yes } desc = you_are_a_movement_leader_desc_value add = 20 } modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } scope:actor = { is_in_pro_hegemon_or_hegemon_movement = yes } desc = diarch_candidate_score.grand_secretariat.pro_hegemon_value add = 20 } modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } scope:actor = { has_court_position = favored_minister_court_position } desc = grand_secretariat_aptitude.favored_minister_value add = 20 } modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } desc = actors_merit_level_desc add = { if = { limit = { scope:actor.merit_level >= scope:actor.top_liege.diarch.merit_level scope:actor.merit >= scope:actor.top_liege.merit } add = 10 } else = { add = -10 } } } modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } desc = ACTOR_HIGH_MOVEMENT_POWER add = { if = { limit = { exists = scope:actor.top_liege.diarch.var:movement_power exists = scope:actor.var:movement_power scope:actor.var:movement_power >= scope:actor.top_liege.diarch.var:movement_power } add = 10 } else = { add = -40 } } } # Events modifier = { add = 25 desc = tgp_power_undermined_modifier_tt has_character_modifier = tgp_power_undermined_modifier # We don't factor for this in the designated/expected diarch 'cause the matrix of overlap'd be hellish. } } # AI #ai_targets = { ai_recipients = liege } #ai_frequency = 0 # #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 } # Grand Secretariat modifier = { scope:recipient = { has_diarchy_type = grand_secretariat } add = { if = { limit = { scope:actor.top_participant_group:dynastic_cycle ?= { exists = var:movement_favored } } add = 10 } if = { limit = { scope:actor = { has_court_position = favored_minister_court_position } } add = 20 } if = { limit = { scope:actor.merit_level >= scope:actor.top_liege.diarch.merit_level scope:actor.merit >= scope:actor.top_liege.merit } add = 10 } if = { limit = { exists = scope:actor.top_liege.diarch.var:movement_power exists = scope:actor.var:movement_power } if = { limit = { scope:actor.var:movement_power >= scope:actor.top_liege.diarch.var:movement_power } add = 10 } else = { add = -100 } } } } } } # 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 = scope:actor.dynasty.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 try_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 = { 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 = { 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_by_tier = { barony = 0 county = 0 duchy = 240 kingdom = 120 empire = 120 hegemony = 120 } 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 try_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 = { try_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:secondary_recipient = { NOT = { is_in_the_same_court_as = scope:actor } } } 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 } # 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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 0 empire = 60 hegemony = 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 try_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 = { try_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 = { NOT = { is_in_the_same_court_as = 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 } # 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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 0 empire = 60 hegemony = 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 try_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 = { try_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:secondary_recipient = { NOT = { is_in_the_same_court_as = scope:actor } } } 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 } # 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_by_tier = { barony = 0 county = 0 duchy = 0 kingdom = 120 empire = 120 hegemony = 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 = { this != scope:actor liege ?= { this = scope:actor.liege diarch ?= scope:recipient 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_by_tier = { barony = 0 county = 120 duchy = 60 kingdom = 60 empire = 60 hegemony = 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 } } } } }