#################################### # Heresy system - shared effects # #################################### # Reusable building blocks for heresy_pulse.0001 router and the three component event chains (light, dangerous-rite, historical). # Faith scope. Sets the cooldown variable that gates faith_heresy_events_pulse. pam_heresy_set_pulse_cooldown_effect = { set_variable = { name = current_heresy value = yes days = pam_heresy_pulse_cooldown_days } } # Faith scope. Resets fervor to the tiered component target. # COMPONENT = 1, 2, or 3. pam_heresy_fervor_reset_effect = { if = { limit = { $COMPONENT$ = 1 } change_fervor = { value = pam_heresy_fervor_reset_component_1_value desc = pam_heresy_fervor_reset_component_1_desc } } else_if = { limit = { $COMPONENT$ = 2 } change_fervor = { value = pam_heresy_fervor_reset_component_2_value desc = pam_heresy_fervor_reset_component_2_desc } } else = { change_fervor = { value = pam_heresy_fervor_reset_component_3_value desc = pam_heresy_fervor_reset_component_3_desc } } } # Christian Situation catalyst pam_heresy_push_catalyst_effect = { if = { limit = { religion = religion:christianity_religion } situation:the_christian_church ?= { trigger_situation_catalyst = $CATALYST$ } } } # Faith scope. # Snapshots the rite's current tenets and the HoR's known rite doctrines. # The pam_heresy_c1_resolve_differences_effect can later identify what the divergence swapped in. pam_heresy_c1_snapshot_pre_divergence_state_effect = { scope:diverging_rite = { every_rite_tenet = { add_to_list = c1_pre_divergence_tenets } } if = { limit = { exists = scope:hor } scope:hor = { every_character_doctrine = { rite_filter = scope:diverging_rite add_to_list = c1_pre_divergence_doctrines } } } } # Faith scope (called after change_rite_divergence has been applied). # Saves scope:differing_tenet / scope:differing_doctrine for the C1 flavour text. # C1 narrates a within-rite shift, so the comparison must be against the pre-divergence snapshot of scope:diverging_rite - not against the parent faith's main rite (which would surface pre-existing differences like Mozarabic's Communion). # C2/C3 keep using rite_growth_resolve_differences_effect because there the mainline-vs-new-rite delta is the relevant story. pam_heresy_c1_resolve_differences_effect = { clear_saved_scope = differing_tenet clear_saved_scope = differing_doctrine scope:diverging_rite = { random_rite_tenet = { limit = { NOT = { is_in_list = c1_pre_divergence_tenets } } save_scope_as = differing_tenet } } if = { limit = { NOT = { exists = scope:differing_tenet } exists = scope:hor } scope:hor = { random_character_doctrine = { rite_filter = scope:diverging_rite limit = { NOT = { is_in_list = c1_pre_divergence_doctrines } } save_scope_as = differing_doctrine } } } } # Faith scope. Picks the rite to diverge in Component 1. # Saves scope:diverging_rite. # Filters: exclude mainline, damper insular_celtic / mozarabic_church to factor 0.1. # Weighted by current divergence so already-divergent rites are more likely. pam_heresy_c1_pick_diverging_rite_effect = { clear_saved_scope = diverging_rite random_faith_rite = { limit = { this != faith.main_rite rite_counties >= 1 head_of_rite ?= { is_ai = yes } } weight = { base = 5 # More divergent rites are more likely to deepen further. modifier = { add = 10 "divergence(faith.main_rite)" >= 25 } modifier = { add = 20 "divergence(faith.main_rite)" >= 50 } modifier = { add = 20 "divergence(faith.main_rite)" >= 75 } # Pluralism-resistant rites are less prone to lurching toward heresy. modifier = { factor = 0.5 rite_has_parameter = pluralism_pluralistic_resistant_to_heresy } # Insular Celtic and Mozarabic are doctrinally weird but historically not the seedbed for heresy outbreaks; dampen without excluding outright. modifier = { factor = 0.1 OR = { this = rite:insular_celtic this = rite:mozarabic_church } } } save_scope_as = diverging_rite } } # Character scope (an AI ruler being swept into a new rite by Component 2 / 3 spread). # Mirrors rite_growth_convert_ruler_to_new_rite_effect, but uses a heresy flag. pam_heresy_convert_ruler_to_new_rite_effect = { if = { limit = { rite != scope:new_rite } set_character_rite_with_conversion = scope:new_rite } every_held_title = { limit = { tier = tier_county rite = scope:source_rite } set_county_rite = scope:new_rite } add_character_flag = { flag = recently_converted_by_heresy years = 10 } # Mirror rite_growth_convert_ruler_to_new_rite_effect rite_growth_convert_court_to_new_rite_effect = yes # Archbishop clerical-region cascade. if = { limit = { any_held_title = { has_clerical_region = yes } } every_held_title = { limit = { has_clerical_region = yes } save_temporary_scope_as = title_check every_county_in_clerical_region = { limit = { rite = scope:source_rite OR = { this = scope:title_check.title_capital_county any_neighboring_county = { this = scope:title_check.title_capital_county } } } set_county_rite = scope:new_rite holder = { if = { limit = { is_eligible_rite_growth_target_trigger = yes } pam_heresy_convert_ruler_to_new_rite_effect = yes } } } } } } # Character scope, an AI ruler pulled into the declared heresy faith by the third component's spread # Faith-conversion equivalent of pam_heresy_convert_ruler_to_new_rite_effect pam_heresy_convert_ruler_to_heresy_faith_effect = { if = { limit = { faith != scope:heresy_faith } # For Catholic historical heresies, conversion is handled here county by # county. Do not call the broad with_conversion effect, which can bypass # the geographical filter and convert territory outside the allowed area. if = { limit = { scope:heresy_faith = { religion = religion:catholic_religion } } set_character_faith = scope:heresy_faith } else = { set_character_faith_with_conversion = scope:heresy_faith if = { limit = { faith != scope:heresy_faith } set_character_faith = scope:heresy_faith } } } every_held_title = { limit = { tier = tier_county faith = scope:origin_faith pam_heresy_neow_permitted_county_trigger = yes } set_county_faith = scope:heresy_faith } add_character_flag = { flag = recently_converted_by_heresy years = 10 } # Faith-side mirror of rite_growth_convert_court_to_new_rite_effect. every_courtier_or_guest = { limit = { is_physically_able_ai = yes faith = scope:origin_faith NOT = { has_character_flag = ai_will_not_convert } } set_character_faith = scope:heresy_faith } every_courtier_away = { limit = { is_physically_able_ai = yes faith = scope:origin_faith NOT = { has_character_flag = ai_will_not_convert } } set_character_faith = scope:heresy_faith } every_pool_character = { province = capital_province limit = { is_physically_able_ai = yes faith = scope:origin_faith NOT = { has_character_flag = ai_will_not_convert } } set_character_faith = scope:heresy_faith } # Faith-side mirror of the rite cascade in pam_heresy_convert_ruler_to_new_rite_effect. if = { limit = { any_held_title = { has_clerical_region = yes } } every_held_title = { limit = { has_clerical_region = yes } save_temporary_scope_as = title_check every_county_in_clerical_region = { limit = { pam_heresy_neow_permitted_county_trigger = yes faith = scope:origin_faith OR = { this = scope:title_check.title_capital_county any_neighboring_county = { this = scope:title_check.title_capital_county } } } set_county_faith = scope:heresy_faith holder = { if = { # Faith version of is_eligible_rite_growth_target_trigger, since scope:source_rite is not set after declaration limit = { is_physically_able_ai_adult = yes faith = scope:origin_faith capital_county = { pam_heresy_neow_permitted_county_trigger = yes } NOR = { scope:founder ?= this has_trait = heresiarch has_trait = herald recently_converted_faith_trigger = yes has_character_flag = recently_converted_by_rite_growth has_character_flag = ai_will_not_convert faith.religious_head ?= this highest_held_title_tier >= tier_empire } } pam_heresy_convert_ruler_to_heresy_faith_effect = yes } } } } } } # Any scope. Spread message for all three components, sent after scope:convert_ruler converts # Reaches same-faith players near the convert and the convert's liege # Shows a rite change when scope:new_rite exists, otherwise a faith change to scope:heresy_faith # TITLE = message title loc key pam_heresy_send_spread_message_effect = { every_player = { limit = { faith = scope:origin_faith NOR = { this = scope:convert_ruler scope:founder ?= this } OR = { scope:convert_ruler.liege ?= this capital_county ?= { squared_distance = { target = scope:convert_ruler.capital_county value <= squared_distance_medium } } } } if = { limit = { exists = scope:new_rite } send_interface_message = { type = msg_pam_heresy_spread title = $TITLE$ left_icon = scope:convert_ruler right_icon = scope:new_rite show_as_tooltip = { scope:convert_ruler = { set_character_rite = scope:new_rite } } } } else_if = { limit = { exists = scope:heresy_faith } send_interface_message = { type = msg_pam_heresy_spread title = $TITLE$ left_icon = scope:convert_ruler right_icon = scope:founder show_as_tooltip = { scope:convert_ruler = { set_character_faith = scope:heresy_faith } } } } } } # Character scope. Unlocks every perk in all three Learning lifestyle trees. pam_heresy_unlock_all_learning_perks_effect = { add_perk = faithful_perk add_perk = zealous_proselytizer_perk add_perk = religious_icon_perk add_perk = prophet_perk add_perk = clerical_justifications_perk add_perk = church_and_state_perk add_perk = radiant_perk add_perk = defender_of_the_faith_perk add_perk = theologian_perk add_perk = pedagogy_perk add_perk = open_minded_perk add_perk = apostate_perk add_perk = scientific_perk add_perk = planned_cultivation_perk add_perk = scholarly_circles_perk add_perk = learn_on_the_job_perk add_perk = sanctioned_loopholes_perk add_perk = erudite_perk add_perk = anatomical_studies_perk add_perk = carefree_perk add_perk = mental_resilience_perk add_perk = restraint_perk add_perk = know_thyself_perk add_perk = wash_your_hands_perk add_perk = iron_constitution_perk add_perk = healthy_perk add_perk = whole_of_body_perk } # Character scope, and this expects scope:new_rite, or omit it for the historical split path pam_heresy_finalise_founder_effect = { add_character_flag = ai_will_not_convert if = { limit = { NOT = { has_trait = heresiarch } } add_trait = heresiarch } # Brief flag mirroring add_heresiarch_trait_effect to prevent removal on conversion. add_character_flag = { flag = new_heresiarch days = 3 } if = { limit = { NOT = { exists = inspiration } } create_inspiration = religious_inspiration } pam_heresy_unlock_all_learning_perks_effect = yes if = { limit = { exists = scope:new_rite } every_courtier_or_guest = { limit = { is_physically_able = yes faith = scope:new_rite.faith rite != scope:new_rite NOT = { has_character_flag = ai_will_not_convert } } set_character_rite = scope:new_rite } } } ###################################################### # Heresy system - Component 3 setup effects # ###################################################### # Faith / character scope helpers used only by heresy_historical.0001 and 0011. # --- Epicenter ruler picker (faith scope) --- # Picks scope:epicenter_ruler. Game rule controls geography: # strict_regional_heresy: prefers the holder of scope:heresy_strict_capital; # falls back to a default-region pick if that holder is unsuitable. # relaxed_regional_heresy: any same-faith duke+ AI ruler in the world. # default_regional_heresy / fallback: a same-faith duke+ AI ruler whose # capital sits inside the heresy's regional trigger. pam_heresy_pick_epicenter_ruler_effect = { clear_saved_scope = epicenter_ruler # Strict: try the historical capital's holder first. if = { limit = { pam_heresy_strict_rule_trigger = yes exists = scope:heresy_strict_capital scope:heresy_strict_capital.holder ?= { faith = root is_landed = yes is_ai = yes highest_held_title_tier >= tier_duchy NOR = { this = root.religious_head has_trait = heresiarch has_trait = herald recently_converted_faith_trigger = yes } } } scope:heresy_strict_capital.holder = { save_scope_as = epicenter_ruler } } # Default / fallback: regional duke+ holder. if = { limit = { NOT = { exists = scope:epicenter_ruler } } random_faith_ruler = { limit = { is_eligible_heresy_epicenter_ruler_trigger = yes OR = { pam_heresy_relaxed_rule_trigger = yes AND = { # Default: must be in heresy region. pam_heresy_default_rule_trigger = yes exists = capital_county capital_county.title_province = { pam_heresy_capital_in_heresy_region_trigger = yes } } AND = { # Strict but historical capital not held by an eligible ruler: # fall back to default-region behaviour rather than skipping. pam_heresy_strict_rule_trigger = yes exists = capital_county capital_county.title_province = { pam_heresy_capital_in_heresy_region_trigger = yes } } } } weight = { base = 100 modifier = { factor = 2 highest_held_title_tier >= tier_kingdom } modifier = { factor = 1.5 OR = { has_trait = zealous has_trait = lifestyle_mystic has_trait = lifestyle_scholar has_trait = theologian } } modifier = { factor = 0.5 opinion = { target = root.religious_head value >= 75 } } } save_scope_as = epicenter_ruler } } } # --- Founder spawn dispatcher (any scope) --- # Calls the matching per-heresy founder template based on scope:heresy_faith # and the resurgence stage. Saves scope:founder at scope:birth_location. # # Stage logic (named historical heresies): # first outbreak: spawn the primary historical figure # second outbreak (resurgence): spawn the named secondary historical figure # third+ outbreak: spawn the per-heresy anonymous resurgence # # Always-anonymous heresies (Paulician, Iconoclast, Adoptionist, Messalian) always use their single anonymous template. pam_heresy_dispatch_founder_spawn_effect = { if = { limit = { scope:heresy_faith = faith:lollard } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_lollard_secondary_fired } } pam_heresy_spawn_lollard_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_lollard_secondary_fired value = yes } } else = { pam_heresy_spawn_lollard_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_lollard_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:hussite } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_hussite_secondary_fired } } pam_heresy_spawn_hussite_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_hussite_secondary_fired value = yes } } else = { pam_heresy_spawn_hussite_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_hussite_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:joachimite } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_joachimite_secondary_fired } } pam_heresy_spawn_joachimite_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_joachimite_secondary_fired value = yes } } else = { pam_heresy_spawn_joachimite_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_joachimite_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:cathar } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_cathar_secondary_fired } } pam_heresy_spawn_cathar_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_cathar_secondary_fired value = yes } } else = { pam_heresy_spawn_cathar_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_cathar_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:waldensian } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_waldensian_secondary_fired } } pam_heresy_spawn_waldensian_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_waldensian_secondary_fired value = yes } } else = { pam_heresy_spawn_waldensian_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_waldensian_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:bogomilist } if = { limit = { exists = scope:is_resurgence } if = { limit = { NOT = { exists = global_var:pam_heresy_bogomilist_secondary_fired } } pam_heresy_spawn_bogomilist_secondary_founder_effect = yes set_global_variable = { name = pam_heresy_bogomilist_secondary_fired value = yes } } else = { pam_heresy_spawn_bogomilist_resurgence_founder_effect = yes } } else = { pam_heresy_spawn_bogomilist_founder_effect = yes } } else_if = { limit = { scope:heresy_faith = faith:paulician } pam_heresy_spawn_paulician_founder_effect = yes } else_if = { limit = { scope:heresy_faith = faith:iconoclast } pam_heresy_spawn_iconoclast_founder_effect = yes } else_if = { limit = { scope:heresy_faith = faith:adoptionist } pam_heresy_spawn_adoptionist_founder_effect = yes } else_if = { limit = { scope:heresy_faith = faith:messalian } pam_heresy_spawn_messalian_founder_effect = yes } } # --- Per-heresy 50-year cooldown setter (faith scope on origin_faith) --- pam_heresy_set_per_heresy_cooldown_effect = { if = { limit = { scope:heresy_faith = faith:lollard } set_global_variable = { name = pam_heresy_lollard_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:hussite } set_global_variable = { name = pam_heresy_hussite_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:joachimite } set_global_variable = { name = pam_heresy_joachimite_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:cathar } set_global_variable = { name = pam_heresy_cathar_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:waldensian } set_global_variable = { name = pam_heresy_waldensian_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:bogomilist } set_global_variable = { name = pam_heresy_bogomilist_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:paulician } set_global_variable = { name = pam_heresy_paulician_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:iconoclast } set_global_variable = { name = pam_heresy_iconoclast_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:adoptionist } set_global_variable = { name = pam_heresy_adoptionist_cooldown value = yes years = 50 } } else_if = { limit = { scope:heresy_faith = faith:messalian } set_global_variable = { name = pam_heresy_messalian_cooldown value = yes years = 50 } } } # --- Pre-declaration setup (faith scope) --- pam_heresy_c3_pre_declaration_setup_effect = { scope:founder = { pam_heresy_dispatch_create_pre_declaration_rite_effect = yes } # Save scope:source_rite so downstream spread helpers filter by the parent-faith mainline rite scope:origin_faith.main_rite = { save_scope_as = source_rite } # Only the rite splits off if = { limit = { exists = scope:new_rite exists = scope:epicenter_ruler.capital_county } scope:epicenter_ruler.capital_county = { set_county_rite = scope:new_rite } scope:epicenter_ruler.capital_county = { every_neighboring_county = { limit = { faith = scope:origin_faith holder.faith ?= scope:origin_faith } set_county_rite = scope:new_rite } } } } # create_rite_from_type takes a literal rite type key, so dispatch on heresy_faith. pam_heresy_dispatch_create_pre_declaration_rite_effect = { if = { limit = { scope:heresy_faith = faith:lollard } create_rite_from_type = { type = lollard_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:hussite } create_rite_from_type = { type = hussite_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:joachimite } create_rite_from_type = { type = joachimite_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:cathar } create_rite_from_type = { type = cathar_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:waldensian } create_rite_from_type = { type = waldensian_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:bogomilist } create_rite_from_type = { type = bogomilist_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:paulician } create_rite_from_type = { type = paulician_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:iconoclast } create_rite_from_type = { type = iconoclast_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:adoptionist } create_rite_from_type = { type = adoptionist_rite save_scope_as = new_rite convert = yes } } else_if = { limit = { scope:heresy_faith = faith:messalian } create_rite_from_type = { type = messalian_rite save_scope_as = new_rite convert = yes } } } # --- Already-declared setup (faith scope) --- pam_heresy_c3_already_declared_setup_effect = { # A heresy already declared at game start never passed through the bull that flips its rite type's convert = no. scope:heresy_faith.main_rite = { set_can_convert_to_rite = yes } scope:founder = { set_character_faith_with_conversion = scope:heresy_faith } if = { limit = { exists = scope:epicenter_ruler.capital_county } scope:epicenter_ruler.capital_county = { set_county_faith = scope:heresy_faith } scope:epicenter_ruler.capital_county = { every_neighboring_county = { limit = { faith = scope:origin_faith } set_county_faith = scope:heresy_faith } } } } pam_seek_communion_reconcile_faith_effect = { custom_tooltip = pam_seek_communion_reconcile_faith_effect_tt faith = { if = { limit = { NOT = { has_doctrine = special_doctrine_ecumenical_christian } } add_doctrine = special_doctrine_ecumenical_christian } } custom_tooltip = { text = pam_seek_communion_absolve_faith_tt faith = { every_faith_character = { limit = { OR = { has_trait = heresiarch has_trait = excommunicated } } if = { limit = { has_trait = heresiarch } remove_trait = heresiarch } else = { remove_trait = excommunicated } } } } }