diplomacy_scheme_trigger = { OR = { scheme_type = befriend scheme_type = sway scheme_type = courting } } intrigue_scheme_trigger = { OR = { scheme_type = murder scheme_type = abduct scheme_type = fabricate_hook scheme_type = steal_back_artifact } } # Should be synced with the schemes listed in can_start_hostile_scheme_against_trigger. hostile_scheme_trigger = { OR = { scheme_type = murder scheme_type = abduct scheme_type = claim_throne scheme_type = fabricate_hook scheme_type = steal_back_artifact } } friendly_scheme_trigger = { OR = { scheme_type = seduce scheme_type = befriend scheme_type = sway scheme_type = courting } } # Should be synced with the schemes listed in hostile_scheme_trigger. can_start_hostile_scheme_against_trigger = { OR = { can_start_scheme = { type = murder target_character = $TARGET$ } can_start_scheme = { type = abduct target_character = $TARGET$ } can_start_scheme = { type = claim_throne target_character = $TARGET$ } can_start_scheme = { type = fabricate_hook target_character = $TARGET$ } can_start_scheme = { type = steal_back_artifact target_character = $TARGET$ } } } agent_valid_to_be_discovered_by_spymaster = { trigger_if = { limit = { exists = scope:target.court_owner.cp:councillor_spymaster } NOT = { this = scope:target.court_owner.cp:councillor_spymaster } } NOT = { has_character_flag = free_to_scheme } trigger_if = { limit = { exists = scope:target.court_owner } NOR = { reverse_has_opinion_modifier = { target = scope:target.court_owner modifier = scheming_against_me } reverse_has_opinion_modifier = { target = scope:target.court_owner modifier = schemed_against_me } } } } personal_scheme_should_not_evaluate_tier_differences_trigger = { # Your spouse doesn't care if you're a different rank than them. scope:owner = { NOT = { is_consort_of = scope:target } } # And laamps are never bothered either way. scope:owner = { is_landless_adventurer = no } scope:target = { is_landless_adventurer = no } } personal_scheme_success_compare_target_liege_tier_trigger = { is_landed_or_landless_administrative = no exists = liege OR = { is_spouse_of = liege is_close_family_of = liege dynasty = liege.dynasty } } is_good_familial_murder_target_trigger = { root = { can_start_scheme = { target_character = prev type = murder } OR = { AND = { # Psychopaths ignore opinion... ai_greed >= very_high_positive_ai_value ai_compassion <= very_high_negative_ai_value has_trait = sadistic # Make sadistic people able to murder their own children } AND = { # Very greedy and non-compassionate characters almost ignore opinion... ai_greed >= very_high_positive_ai_value ai_compassion <= high_negative_ai_value opinion = { target = prev value <= medium_positive_opinion } } AND = { # Significantly greedy and non-compassionate characters can murder even at positive opinion ai_greed >= high_positive_ai_value ai_compassion < 0 opinion = { target = prev value <= low_positive_opinion } } AND = { # Somewhat greedy characters can murder people they just barely dislike... ai_greed >= medium_positive_ai_value opinion = { target = prev value <= low_negative_opinion } } AND = { # Otherwise, their opinion must be rather poor... opinion = { target = prev value <= medium_negative_opinion } } } } NOR = { has_opinion_modifier = { modifier = received_title_county target = root } has_opinion_modifier = { modifier = received_title_duchy target = root } has_opinion_modifier = { modifier = received_title_kingdom target = root } has_opinion_modifier = { modifier = received_title_empire target = root } } #is a valid murder target if scheme owner is in line of succession to any of target's titles or at least 3rd in line of succession to any titles the target is 1st to inherit OR = { any_held_title = { tier >= root.highest_held_title_tier place_in_line_of_succession = { target = root value <= { value = 2 if = { limit = { root.highest_held_title_tier > tier_barony } add = 1 } } } } any_heir_title = { NOT = { holder = root } tier >= root.highest_held_title_tier place_in_line_of_succession = { target = root value <= { value = 2 if = { limit = { root.highest_held_title_tier > tier_barony } add = 1 } } } } } } # This trigger is a bit contrived in some way to ensure absolutely everyone gets evaluated without any early-outing # It should always return true # We use "count = all" and trigger_ifs to ensure that all have to be evaluated, and that all return build_murder_targets_trigger = { any_relation = { # Rivals are good targets for murder schemes type = rival count = all trigger_if = { limit = { root = { ai_honor <= low_positive_ai_value can_start_scheme = { target_character = prev type = murder } } } add_to_temporary_list = murder_targets } } any_relation = { # Same with nemeses type = nemesis count = all trigger_if = { limit = { root = { ai_honor <= medium_positive_ai_value can_start_scheme = { target_character = prev type = murder } } } add_to_temporary_list = murder_targets } } trigger_if = { # Greedy people have no qualms murdering their way up the succession... limit = { ai_greed >= low_positive_ai_value exists = dynasty } dynasty = { any_dynasty_member = { count = all trigger_if = { limit = { is_good_familial_murder_target_trigger = yes } add_to_temporary_list = murder_targets } } } any_close_or_extended_family_member = { count = all trigger_if = { limit = { NOT = { is_in_list = murder_targets } is_good_familial_murder_target_trigger = yes } add_to_temporary_list = murder_targets } } } trigger_if = { # Greedy people want to murder their liege's high aptitude tax collector... limit = { ai_greed >= low_positive_ai_value is_independent_ruler = no exists = liege liege = { any_tax_collector = { any_tax_collector_vassal = { this = root } check_tax_collector_aptitude = { CHARACTER = this VALUE >= 4 } add_to_temporary_list = murder_targets } } } } trigger_if = { # Some Clan members want to murder Extolled people out of pure spite and malice limit = { ai_greed >= 0 ai_vengefulness >= 0 ai_compassion <= medium_negative_ai_value house.house_head ?= { is_ruler = yes government_has_flag = government_is_clan } ai_wants_low_unity = yes } house = { any_house_member = { has_trait = extolled add_to_temporary_list = murder_targets } } } any_consort = { # Unfaithful spouses trigger_if = { limit = { root = { ai_compassion <= 0 can_start_scheme = { target_character = prev type = murder } } exposed_cheating_on_spouse_trigger = { SPOUSE = root } add_to_temporary_list = murder_targets } } } trigger_if = { # Certain vassals will plot against their liege under certain conditions limit = { highest_held_title_tier > tier_barony exists = liege liege = { tyranny >= medium_tyranny } opinion = { target = liege value <= high_negative_opinion } ai_rationality >= medium_positive_ai_value } liege = { add_to_temporary_list = murder_targets } } trigger_if = { # Murdering troublesome claimants is something you want to do... limit = { is_playable_character = yes primary_title.tier >= tier_duchy any_targeting_faction = { faction_is_type = claimant_faction special_character = { add_to_temporary_list = murder_targets } } } } trigger_if = { # Paranoid characters want to murder claimants to their titles limit = { has_trait = paranoid ai_compassion <= low_negative_ai_value ai_rationality <= 0 is_playable_character = yes primary_title.tier >= tier_duchy any_held_title = { any_claimant = { add_to_temporary_list = murder_targets } } } } any_spouse = { # Murder infertile spouses if you've yet to have an heir (and you're heartless...) trigger_if = { limit = { root = { is_playable_character = yes ai_compassion <= 0 ai_honor <= 0 fertility > 0.1 NOT = { any_child = { is_heir_of = root } } can_start_scheme = { target_character = prev type = murder } } is_ai = yes fertility < 0.1 add_to_temporary_list = murder_targets } } } } scheme_is_still_valid_trigger = { scope:target = { OR = { exists = location in_diplomatic_range = scope:owner } } } can_use_befriend_scheme_trigger = { OR = { has_perk = befriend_perk AND = { exists = dynasty dynasty = { has_dynasty_perk = fp1_adventure_legacy_5 } target_is_vassal_or_below = $TARGET$ } culture = { has_cultural_parameter = automatic_befriend_access } any_character_struggle = { involvement = involved has_struggle_phase_parameter = struggle_unlocks_befriend_schemes_for_everyone } AND = { government_has_flag = government_is_clan is_in_same_clan_as_trigger = { CHARACTER = $TARGET$ } house = { has_house_unity_stage = harmonious } } government_has_flag = government_is_nomadic } } # Need to separate travel triggers from rest can_seduce_scheme_trigger = { $OWNER$ = { is_adult = yes is_imprisoned = no OR = { is_ai = no #Players may override their character's sexuality for the purposes of cynical seductions. is_attracted_to_gender_of = $TARGET$ } is_below_ai_lover_soft_cap_trigger = yes NOR = { has_trait = celibate has_character_flag = is_party_baron has_relation_lover = $TARGET$ guaranteed_under_20_incest_rejection_trigger = { TARGET = $TARGET$ SEDUCER = $OWNER$ } AND = { has_character_modifier = rejected_from_marriage_bed_modifier is_spouse_of = $TARGET$ } } } $TARGET$ = { is_adult = yes is_imprisoned = no is_attracted_to_gender_of = $OWNER$ NOR = { has_character_flag = block_seduce_attempts has_trait = intellect_bad_3 has_trait = incapable has_trait = celibate has_opinion_modifier = { modifier = seduce_permanent_blocker_opinion target = $OWNER$ } has_opinion_modifier = { modifier = seduce_regular_cooldown_opinion target = $OWNER$ } } OR = { exists = location in_diplomatic_range = $OWNER$ } trigger_if = { limit = { $OWNER$ = { is_ai = yes } } is_below_ai_lover_soft_cap_trigger = yes trigger_if = { # Block AI from seducing lowborn nobodies in the players court limit = { liege ?= { is_ai = no } NOR = { is_courtier_of = $OWNER$ is_foreign_court_or_pool_guest_of = $OWNER$ } } OR = { is_lowborn = no is_playable_character = yes } } trigger_if = { #So players don't get spammed by AI seduction limit = { is_ai = no } NOT = { any_targeting_scheme = { scheme_type = seduce } } } } } } ################################################## # Scheme Ending Triggers # Is this a scheme to kill someone who could be conceivably saved by something unexpected? is_savable_murder_scheme_trigger = { OR = { scheme_type = murder scheme_type = laamp_base_3011_contract_scheme } } # Could & would this lover of $TARGET$ available_lover_to_sacrifice_in_murder_trigger = { is_ruler = no is_available_ai_adult = yes # Filter out lovers that don't actually like you at all. NOT = { has_trait = disloyal } OR = { has_trait = loyal opinion = { target = $TARGET$ # And frankly this is being generous. value >= 1 } } } ################################################## # Murder Intercept Triggers # Would this character slack off from their task of guarding scope:target? bodyguard_will_actually_do_job_trigger = { # Basically functional. is_ruler = no is_physically_able_ai_adult = yes # Can't hate their charge. save_temporary_scope_as = char_temp NOR = { # Require that they don't hate their liege. has_relation_rival = scope:target opinion = { target = scope:target value <= high_negative_opinion } # Can't be directly involved with the scheme either. scope:scheme = { any_scheme_agent_character = { this = scope:char_temp } } scope:owner = scope:char_temp } } foodtaster_will_actually_do_job_trigger = { # Basically functional. is_ruler = no is_physically_able_ai_adult = yes # Can't be directly involved with the scheme. ## We're a bit pickier here, since food tasters can't just slack off from their duties like bodyguards or cupbearers arguably can. ### You eat the food or you don't, so if you don't, you really must've planned ahead to look like you did. save_temporary_scope_as = char_temp NOR = { scope:scheme = { any_scheme_agent_character = { this = scope:char_temp } } scope:owner = scope:char_temp } } cupbearer_will_actually_do_job_trigger = { # Basically functional. is_physically_able_ai_adult = yes # Can't hate their charge. save_temporary_scope_as = char_temp NOR = { # Require that they don't hate their liege. has_relation_rival = scope:target opinion = { target = scope:target value <= high_negative_opinion } # Can't be directly involved with the scheme either. scope:scheme = { any_scheme_agent_character = { this = scope:char_temp } } scope:owner = scope:char_temp } } ################################################## # Scheme Animation Triggers should_use_amorous_scheme_animation_trigger = { OR = { scheme_type = seduce scheme_type = elope scheme_type = courting } } ################################################## # Agent Invite Triggers would_agent_accept_petty_bribes_against_target_trigger = { exists = scope:scheme trigger_if = { limit = { exists = scope:scheme.scheme_target_character } NOT = { scope:recipient = { is_parent_of = scope:scheme.scheme_target_character } } } trigger_if = { limit = { exists = scope:scheme.scheme_target_title } NOT = { scope:recipient = { is_parent_of = scope:scheme.scheme_target_title.holder } } } } would_actor_consider_dramatic_enticement_trigger = { scope:actor = { OR = { is_ai = no has_trait = humble has_trait = content has_trait = profligate AND = { has_trait = vengeful has_relation_rival = scope:recipient } AND = { has_trait = impatient NOR = { has_trait = arrogant has_trait = ambitious } } } } } actor_has_valid_de_jure_enticement_county_trigger = { holder = scope:actor tier = tier_county NOT = { this = scope:actor.capital_county } } actor_has_valid_claimed_enticement_county_trigger = { holder = scope:actor tier = tier_county NOT = { this = scope:actor.capital_county } } ################################################## # Can Add Agent to Scheme Triggers is_valid_agent_standard_trigger = { # The usual standard restrictions. is_adult = yes is_imprisoned = no # Can't be an existing agent in any scheme. save_temporary_scope_as = char_temp scope:owner = { NOT = { any_scheme = { any_scheme_agent_character = { this = scope:char_temp } } } } } char_can_fit_into_scheme_trigger = { save_temporary_scope_as = char_temp $SCHEME$ = { any_scheme_agent_slot = { is_filled = no save_temporary_scope_as = slot_temp } scope:char_temp = { is_valid_as_agent_in_slot = scope:slot_temp } } } ################################################## # Scheme APA Triggers scheme_apa_apply_modifier_plus_secrecy_trigger = { #TODO_CD_EP3_ERCC; ask for scheme secrecy trigger. scheme_apa_apply_modifier_trigger = { MODIFIER = $MODIFIER$ } } scheme_apa_apply_modifier_trigger = { NOR = { has_variable = scheme_pulse_action_on_cooldown has_scheme_modifier = $MODIFIER$ } } scheme_apa_apply_positive_progress_trigger = { NOT = { has_variable = scheme_pulse_action_on_cooldown } # How many days in before we want to allow progress gains? scheme_duration_days >= 365 } scheme_apa_apply_negative_progress_trigger = { NOT = { has_variable = scheme_pulse_action_on_cooldown } save_temporary_scope_as = scheme scheme_progress > scheme_progress_33 } ################################################## # Agent Availability Triggers can_have_agent_hitman_trigger = { always = yes } can_have_agent_assassin_trigger = { always = yes } can_have_agent_lookout_trigger = { always = yes } can_have_agent_infiltrator_trigger = { always = yes } can_have_agent_footpad_trigger = { always = yes } can_have_agent_alibi_trigger = { always = yes } can_have_agent_thug_trigger = { always = yes } can_have_agent_comrade_in_arms_trigger = { always = yes } can_have_agent_socialite_trigger = { always = yes } can_have_agent_musician_trigger = { always = yes } can_have_agent_tumbler_trigger = { always = yes } can_have_agent_poet_trigger = { always = yes } can_have_agent_gabbler_trigger = { always = yes } can_have_agent_shill_trigger = { always = yes } can_have_agent_diplomat_trigger = { always = yes } can_have_agent_justiciar_trigger = { always = yes } can_have_agent_justiciar_speed_trigger = { always = yes } can_have_agent_scribe_trigger = { always = yes } can_have_agent_cleric_trigger = { always = yes } can_have_agent_theologian_trigger = { always = yes } can_have_agent_herald_trigger = { always = yes } can_have_agent_wolf_hunter_trigger = { always = yes } can_have_agent_thief_trigger = { always = yes } can_have_agent_tutor_trigger = { always = yes } can_have_agent_poisoner_trigger = { domicile ?= { has_domicile_parameter = camp_unlocks_poisoner_scheme_agents } } can_have_agent_muscle_trigger = { always = yes } can_have_agent_drillmaster_trigger = { always = yes } can_have_agent_tracker_trigger = { always = yes } can_have_agent_physic_trigger = { always = yes } can_have_agent_smith_trigger = { always = yes } can_have_agent_ambusher_trigger = { always = yes } can_have_agent_bodyguard_trigger = { always = yes } can_have_agent_scout_trigger = { always = yes } can_have_agent_outrider_trigger = { always = yes } can_have_agent_bookkeeper_trigger = { always = yes } can_have_agent_bailiff_trigger = { always = yes } can_have_agent_draughtsman_trigger = { always = yes } can_have_agent_planner_trigger = { always = yes } can_have_agent_supplier_trigger = { always = yes } can_have_agent_outcast_trigger = { always = yes } can_have_agent_wrangler_trigger = { always = yes } can_have_agent_decoy_trigger = { always = yes } can_have_agent_eunuch_trigger = { always = yes } can_have_agent_wrangler_speed_trigger = { always = yes } can_have_agent_theologian_success_trigger = { always = yes } can_have_agent_cleric_success_trigger = { always = yes } can_have_agent_lookout_success_trigger = { always = yes } can_have_agent_lookout_speed_trigger = { always = yes } ################################################## # Countermeasure Triggers # Does a specific countermeasure apply to you? countermeasure_parametre_applies_againt_char_trigger = { $SCHEME_TARGET$.host ?= { has_scheme_countermeasure_parameter = $PARAMETER$ # Don't apply countermeasures vs. ourselves. NOT = { this = $SCHEME_OWNER$ } # And if the countermeasure only affects the host, then restrict it. trigger_if = { limit = { has_scheme_countermeasure_parameter = countermeasure_only_affects_court_holder } this = $SCHEME_TARGET$ } } } # Can a character adopt defensive measures against hostile schemes? can_set_own_countermeasures_trigger = { custom_tooltip = { OR = { # You can only set them for your home court. host = prev # And then we use this in here so we can valid ## ... valid what, Ewan? _What can we valid_? You never finished your sentence and now we will never know. is_ruler = no } text = can_set_own_countermeasures_trigger.tt } } # Used in scripted modifiers to determine if the AI should be deploying countermeasures that reduce secrecy or generally affect success chance. should_ai_take_preemptive_countermeasures_trigger = { # Don't do this if we've already deployed countermeasures. NOT = { has_scheme_countermeasure_parameter = has_any_countermeasure_active } any_targeting_scheme = { # Make sure we'd need to do this at all. has_variable = apply_countermeasures # And we don't want to face schemes that're already at a later stage. is_scheme_exposed = no # Buuuut also give them their grace period to get started. has_variable = secrecy_grace_period var:secrecy_grace_period <= 0 } } ################################################## # Countermeasure Access Triggers # This trigger means that a character will only ever have access to the best version of a given countermeasure. ## Please note that some tiers may be inaccessible: they're set up so they can be hooked in to stuff, but we haven't assigned them all out straight away. ## Use them if you want them but don't feel obligated, basically. scheme_countermeasure_access_select_best_tier_trigger = { save_temporary_scope_value_as = { name = checked_tier value = $TIER$ } trigger_if = { limit = { scheme_countermeasure_access_t4_$COUNTERMEASURE$_trigger = yes } scope:checked_tier = 4 } trigger_else_if = { limit = { scheme_countermeasure_access_t3_$COUNTERMEASURE$_trigger = yes } scope:checked_tier = 3 } trigger_else_if = { limit = { scheme_countermeasure_access_t2_$COUNTERMEASURE$_trigger = yes } scope:checked_tier = 2 } trigger_else = { scope:checked_tier = 1 } } # Can this character access the higher tiers of the Bounties for Whispers countermeasure? scheme_countermeasure_access_t2_bounties_for_whispers_trigger = { OR = { has_trait_with_flag = trait_unlocks_t2_countermeasures culture = { has_cultural_parameter = cultrad_unlocks_t2_countermeasures } } } scheme_countermeasure_access_t3_bounties_for_whispers_trigger = { always = no } scheme_countermeasure_access_t4_bounties_for_whispers_trigger = { OR = { culture = { has_cultural_parameter = cultrad_unlocks_t4_bounties_for_whispers } faith = { has_doctrine_parameter = tenet_unlocks_t4_bounties_for_whispers } } } # Can this character access the higher tiers of the Arbitrary Arrests countermeasure? scheme_countermeasure_access_t2_arbitrary_arrests_trigger = { OR = { has_trait_with_flag = trait_unlocks_t2_countermeasures has_trait_with_flag = trait_unlocks_t2_arbitrary_arrests culture = { has_cultural_parameter = cultrad_unlocks_t2_countermeasures } } } scheme_countermeasure_access_t3_arbitrary_arrests_trigger = { culture = { has_cultural_parameter = cultrad_unlocks_t3_arbitrary_arrests } } scheme_countermeasure_access_t4_arbitrary_arrests_trigger = { always = no } # Can this character access the higher tiers of the Strengthen Sentries countermeasure? scheme_countermeasure_access_t2_strengthen_sentries_trigger = { OR = { has_trait_with_flag = trait_unlocks_t2_countermeasures culture = { has_cultural_parameter = cultrad_unlocks_t2_countermeasures } } } scheme_countermeasure_access_t3_strengthen_sentries_trigger = { culture = { has_cultural_parameter = cultrad_unlocks_t3_strengthen_sentries } } scheme_countermeasure_access_t4_strengthen_sentries_trigger = { always = no } # Can this character access the higher tiers of the Redouble Guards countermeasure? scheme_countermeasure_access_t2_redouble_guards_trigger = { OR = { has_trait_with_flag = trait_unlocks_t2_countermeasures culture = { OR = { has_cultural_parameter = cultrad_unlocks_t2_countermeasures has_cultural_parameter = cultrad_unlocks_t2_redouble_guards } } } } scheme_countermeasure_access_t3_redouble_guards_trigger = { culture = { has_cultural_parameter = cultrad_unlocks_t3_redouble_guards } } scheme_countermeasure_access_t4_redouble_guards_trigger = { always = no } # Can this character access the higher tiers of the Withdraw from View countermeasure? scheme_countermeasure_access_t2_withdraw_from_view_trigger = { OR = { OR = { has_trait_with_flag = trait_unlocks_t2_countermeasures culture = { has_cultural_parameter = cultrad_unlocks_t2_countermeasures } } has_trait_with_flag = trait_unlocks_t2_withdraw_from_view } } scheme_countermeasure_access_t3_withdraw_from_view_trigger = { OR = { has_trait_with_flag = trait_unlocks_t3_withdraw_from_view faith = { has_doctrine_parameter = tenet_unlocks_t3_withdraw_from_view } } } scheme_countermeasure_access_t4_withdraw_from_view_trigger = { has_trait_with_flag = trait_unlocks_t4_withdraw_from_view } scheme_generic_ai_blocker_trigger = { any_scheme = { OR = { scheme_type = befriend scheme_type = sway scheme_type = seduce scheme_type = courting scheme_type = elope scheme_type = learn_language scheme_type = teach_governor } } }