@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 = { save_scope_as = use_strife_not_tyranny imprison_HoF_consequences_effect = yes imprison_tyranny_effect = yes } # Do we want a war or an escape? scope:recipient = { add_opinion = { target = scope:actor modifier = attempted_imprisonment_opinion } # 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 = { trigger = { scope:actor = { is_landed = yes # consistent with char_interaction.0283 } } 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 } } # secondary_recipient is always saved whenever you use it on anyone who isn't yourself or your liege, so we use this fact to validate it after the redirect, otherwise it will show up on every other ruler in the game trigger_if = { limit = { exists = scope:secondary_recipient } 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 = { trigger = { exists = scope:secondary_recipient # because the secondary_recipient hasn't been chosen when the interaction is initialized } who = scope:secondary_recipient opinion_target = scope:actor multiplier = 1 } ## Of scope:recipient. opinion_modifier = { trigger = { exists = scope:secondary_recipient } who = scope:secondary_recipient opinion_target = scope:recipient multiplier = -0.5 } # Personality. ## Values. ai_value_modifier = { trigger = { exists = scope:secondary_recipient } 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 = { exists = scope:secondary_recipient 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 = { exists = scope:actor.var:movement_power_individual scope:actor = { government_has_flag = government_is_celestial is_diarch_of_target = scope:recipient exists = var:movement_power_individual } 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 } 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. trigger_if = { limit = { exists = scope:secondary_recipient } scope:secondary_recipient = { is_valid_basic_candidate_for_vizier_trigger = yes OR = { is_courtier_of = scope:actor AND = { highest_held_title_tier = tier_barony liege = scope:actor } } } } trigger_else = { scope:recipient = { this = 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 } redirect = { if = { limit = { scope:recipient != scope:actor } scope:recipient = { save_scope_as = secondary_recipient } scope:actor = { save_scope_as = recipient } } } 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 } } } } }