From 6d716060526eb903bde0026889e925063f52b0b5 Mon Sep 17 00:00:00 2001 From: Fishedotjpg Date: Mon, 8 Dec 2025 00:17:52 +0000 Subject: [PATCH] Admin is no longer safe from independence and disintegration --- N3OW/common/factions/00_factions.txt | 1558 +++++++++++++++++ .../factions/00_nation_fracturing_faction.txt | 407 +++++ 2 files changed, 1965 insertions(+) create mode 100644 N3OW/common/factions/00_factions.txt create mode 100644 N3OW/common/factions/00_nation_fracturing_faction.txt diff --git a/N3OW/common/factions/00_factions.txt b/N3OW/common/factions/00_factions.txt new file mode 100644 index 00000000..35fc2ecf --- /dev/null +++ b/N3OW/common/factions/00_factions.txt @@ -0,0 +1,1558 @@ +independence_faction = { + casus_belli = independence_faction_war + + short_effect_desc = independence_faction_short_effect_desc + + sort_order = 2 + + is_shown = { + NAND = { + tgp_is_ceremonial_liege_trigger = yes + tgp_is_ceremonial_regent_trigger = no + } + } + + discontent_progress = { + base = 0 + + common_discontent_progress_modifier = yes + } + + power_threshold = { + base = 80 + + modifier = { + add = 20 + faction_target = { + has_perk = hard_rule_perk + } + desc = "FACTION_POWER_HARD_RULE" + } + + dynamic_power_threshold_scripted_modifier = { + FACTION_TYPE1 = claimant_faction + FACTION_TYPE2 = liberty_faction + FACTION_TYPE3 = populist_faction + } + } + + demand = { + save_scope_as = faction + + faction_leader = { + save_scope_as = faction_leader + } + + faction_target = { + save_scope_as = faction_target + } + + # Let the human players in the faction know that the demand will be sent + every_faction_member = { + limit = { + is_ai = no + this != scope:faction.faction_leader + } + trigger_event = faction_demand.0005 + } + + # Send the actual demand in 5 days + faction_target = { + trigger_event = { + id = faction_demand.0001 + days = 5 + } + } + } + + ai_demand_chance = { + base = 0 + + # 40% base chance at minimum power (80%), increasing linearly + compare_modifier = { + value = faction_power + multiplier = 0.5 + } + + # Once the faction has a good chance to win (10% stronger than liege) demand chance increases much more rapidly. + compare_modifier = { + trigger = { faction_power > 110 } + value = faction_power + multiplier = 1 + } + + modifier = { + add = 100 + faction_target = { + is_at_war = yes # Independence Factions are opportunistic bastards! + } + } + + modifier = { + add = -1000 + faction_target = { + involved_activity ?= { + has_activity_type = activity_coronation + activity_host = prev + } + } + } + } + + ai_create_score = { + base = -175 # Base reluctance value we must overcome to start an Independence Faction. + + ############ + # BLOCKERS # + common_create_faction_blockers = { + FACTION_TARGET = scope:target + FLAG = recent_independence_faction_war + } + + independence_faction_create_blockers = { + FACTION_TARGET = scope:target + } + + ####################### + # Standard AI Weights # + + common_faction_modifiers = { + FACTION_TARGET = scope:target + OPINION_MULTIPLIER = -0.4 + MAX_OPINION = 100 + POWER = 0 + THRESHOLD = 80 + } + + independence_faction_modifiers = { + FACTION_TARGET = scope:target + } + + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + + # EP3 - Grand Ambitions Story Cycle + modifier = { + desc = "EP3_GRAND_AMBITIONS_STORY" + any_owned_story = { + type = grand_ambitions_story_cycle + var:target_char ?= scope:target + } + factor = 1.5 + } + # TGP Dynastic Cycle in Instability phase + modifier = { + desc = "FACTION_REASON_DYNASTIC_CYCLE_INSTABILITY" + add = 25 + scope:target = { + top_participant_group:dynastic_cycle ?= { + has_participant_group_parameter = dynastic_cycle_external_tributaries_vassals_increased_independence_desire + } + } + } + + modifier = { + scope:target = { has_character_modifier = disbelieved_mandala_modifier } + add = 15 + desc = is_disbelieved_mandala + } + } + + ai_join_score = { + base = -150 # Base reluctance value we must overcome to join an Independence Faction. + + ############ + # BLOCKERS # + + common_join_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + } + + ####################### + # Standard AI Weights # + + common_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + OPINION_MULTIPLIER = -0.4 + MAX_OPINION = 100 + POWER = scope:faction.faction_power + THRESHOLD = scope:faction.faction_power_threshold + } + + independence_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + } + + # Small multiplier for my neighbors already in the Faction + modifier = { + desc = "FACTION_REASON_NEIGHBORS" + + scope:faction = { + any_faction_member = { #suppress the description printout if factor is 1 + any_neighboring_realm_same_rank_owner = { + this = root + } + } + } + + factor = { + value = 1 + scope:faction = { + every_faction_member = { + if = { + limit = { + any_neighboring_realm_same_rank_owner = { + this = root + } + } + add = 0.25 + } + } + } + } + } + + modifier = { + desc = "FACTION_REASON_POWERFUL_VASSAL" + factor = 2 + is_powerful_vassal_of = scope:faction.faction_target + } + + struggle_faction_modifiers = yes + + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:faction.faction_target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + #EP3 admin legitimacy event + modifier = { + desc = "FACTION_REASON_LOW_LEGITIMACY_CHALLENGER" + add = 25 + scope:faction = { + any_faction_member = { + has_character_flag = low_legitimacy_admin_factions_flag + } + } + } + # TGP Dynastic Cycle in Instability phase + modifier = { + desc = "FACTION_REASON_DYNASTIC_CYCLE_INSTABILITY" + add = 25 + scope:faction.faction_target = { + top_participant_group:dynastic_cycle ?= { + has_participant_group_parameter = dynastic_cycle_external_tributaries_vassals_increased_independence_desire + } + } + } + } + + is_character_valid = { + common_character_validity_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + has_valid_faction_members_trigger = yes + } + + can_character_create_ui = { + base_faction_trigger = { FACTION_TYPE = independence_faction } + + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + liege = { + top_liege = this + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + #PROPPA CONFEDERATION VASSALS + trigger_if = { + limit = { + liege = { + is_confederation_member = yes + } + } + #Confederations block most faction types + custom_tooltip = { + text = confederaton_blocks_faction + NOR = { + government_has_flag = government_is_nomadic + government_has_flag = government_is_tribal + } + } + } + # The emperor does not want to leave his empire + tgp_is_ceremonial_liege_trigger = no + # Ministers cannot join this faction + custom_description = { + text = target_is_a_minister_desc + subject = this + tgp_is_any_minister = no + } + } + + can_character_create = { + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + liege = { + top_liege = this + } + + custom_description = { + text = character_blocked_from_joining # will never be displayed but without it, errors are triggered + OR = { + is_ai = no + culture != scope:target.culture + faith != scope:target.faith + NOT = { + scope:target = { + is_rightful_liege_of = root + } + } + any_sub_realm_county = { + percent <= 0.5 + save_temporary_scope_as = current_county + scope:target.primary_title = { + any_in_de_jure_hierarchy = { this = scope:current_county } + } + } + government_has_flag = government_is_nomadic + } + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + #PROPPA CONFEDERATION VASSALS + trigger_if = { + limit = { + liege = { + is_confederation_member = yes + } + } + #Confederations block most faction types + custom_tooltip = { + text = confederaton_blocks_faction + NOR = { + government_has_flag = government_is_nomadic + government_has_flag = government_is_tribal + } + } + } + # The emperor does not want to leave his empire + tgp_is_ceremonial_liege_trigger = no + # Ministers cannot join this faction + custom_description = { + text = target_is_a_minister_desc + subject = this + tgp_is_any_minister = no + } + } + + can_character_join = { + common_can_character_join_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + #PROPPA CONFEDERATION VASSALS + trigger_if = { + limit = { + liege = { + is_confederation_member = yes + } + } + #Confederations block most faction types + custom_tooltip = { + text = confederaton_blocks_faction + NOR = { + government_has_flag = government_is_nomadic + government_has_flag = government_is_tribal + } + } + } + # The emperor does not want to leave his empire + tgp_is_ceremonial_liege_trigger = no + # Ministers cannot join this faction + custom_description = { + text = target_is_a_minister_desc + subject = this + tgp_is_any_minister = no + } + } + + can_character_become_leader = { + can_become_leader_of_faction_trigger = yes + } + + on_creation = { + save_scope_as = faction + tgp_bloc_members_join_faction_effect = yes + if = { + limit = { + any_player = { + has_government = landless_adventurer_government + is_within_diplo_range = { CHARACTER = scope:faction.faction_target } + OR = { + has_contact = scope:faction.faction_leader + NOT = { has_contact = scope:faction.faction_target } + } + any_character_task_contract = { + task_contract_type = laamp_join_faction_contract + count <= 3 + } + can_create_task_contract = { + type_name = laamp_join_faction_contract + employer = scope:faction.faction_leader + } + save_temporary_scope_as = player_laamp + } + } + scope:player_laamp = { + create_task_contract = { + task_contract_type = laamp_join_faction_contract + task_contract_tier = scope:faction.faction_leader.task_contract_tier_value + location = scope:faction.faction_leader.primary_title.title_province + task_contract_employer = scope:faction.faction_leader + target = scope:faction.faction_target + } + } + } + } + + county_allow_join = no + county_allow_create = no +} + +liberty_faction = { + casus_belli = liberty_faction_war + + desc = { + first_valid = { + triggered_desc = { + trigger = { + faction_target = { government_has_flag = government_is_administrative } + } + desc = liberty_faction_desc_admin + } + triggered_desc = { + trigger = { + faction_target = { government_has_flag = government_is_tribal } + } + desc = liberty_faction_desc_tribal + } + triggered_desc = { + trigger = { + faction_target = { government_has_flag = government_is_feudal } + } + desc = liberty_faction_desc_feudal + } + desc = liberty_faction_desc + } + } + + short_effect_desc = { + first_valid = { + triggered_desc = { + trigger = { + faction_target = { government_has_flag = government_is_administrative } + } + desc = liberty_faction_short_effect_desc_admin + } + triggered_desc = { + trigger = { + faction_target = { government_has_flag = government_is_tribal } + } + desc = liberty_faction_short_effect_desc_tribal + } + desc = liberty_faction_short_effect_desc + } + } + + sort_order = 4 + + is_shown = { + NAND = { + tgp_is_ceremonial_liege_trigger = yes + tgp_is_ceremonial_regent_trigger = no + } + } + + discontent_progress = { + base = 0 + + common_discontent_progress_modifier = yes + } + + power_threshold = { + base = 80 + + modifier = { + add = 20 + faction_target = { + has_perk = hard_rule_perk + } + desc = "FACTION_POWER_HARD_RULE" + } + + #Lower the threshold depending on the state of other factions + dynamic_power_threshold_scripted_modifier = { + FACTION_TYPE1 = claimant_faction + FACTION_TYPE2 = independence_faction + FACTION_TYPE3 = populist_faction + } + } + + demand = { + save_scope_as = faction + + faction_leader = { + save_scope_as = faction_leader + } + + faction_target = { + save_scope_as = faction_target + } + + # Let the human players in the faction know that the demand will be sent + every_faction_member = { + limit = { + is_ai = no + this != scope:faction.faction_leader + } + trigger_event = faction_demand.0105 + } + + # Send the actual demand in 5 days + faction_target = { + trigger_event = { + id = faction_demand.0101 + days = 5 + } + } + } + + ai_demand_chance = { + base = 0 + + # 30% base chance at minimum power (80%), increasing linearly + compare_modifier = { + value = faction_power + multiplier = 0.375 + } + + # Once the faction has a good chance to win (10% stronger than liege) demand chance increases much more rapidly. + compare_modifier = { + trigger = { faction_power > 110 } + value = faction_power + multiplier = 0.75 + } + + # Less likely if already in a war with an external ruler - the Liberty Faction is pretty sporting + modifier = { + add = -75 + faction_target = { + any_war_enemy = { + NOT = { + target_is_liege_or_above = root.faction_target + } + } + } + } + + modifier = { + add = -1000 + faction_target = { + involved_activity ?= { + has_activity_type = activity_coronation + activity_host = prev + } + } + } + } + + on_war_start = { + every_faction_member = { + limit = { + has_variable = gathered_support_for_faction + var:gathered_support_for_faction = root + } + spawn_army = { + name = gathered_support_for_faction_army + levies = { + value = this.massive_influence_value + multiply = 3 + } + men_at_arms = { + type = light_footmen + stacks = 2 + } + location = this.location + war = root.faction_war + inheritable = yes + } + } + } + + is_character_valid = { + common_character_validity_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + has_valid_faction_members_trigger = yes + } + + can_character_create_ui = { + base_faction_trigger = { FACTION_TYPE = liberty_faction } + + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + trigger_if = { + limit = { scope:target = { realm_law_use_imperial_bureaucracy = yes } } + custom_description = { + text = has_lowest_imperial_bureaucracy + subject = scope:target + scope:target = { + OR = { + has_realm_law = imperial_bureaucracy_1 + has_realm_law = imperial_bureaucracy_2 + has_realm_law = imperial_bureaucracy_3 + } + } + } + } + trigger_else_if = { + limit = { scope:target = { government_has_flag = government_is_tribal } } + custom_description = { + text = has_lowest_tribal_authority + subject = scope:target + scope:target = { + OR = { + has_realm_law = tribal_authority_1 + has_realm_law = tribal_authority_2 + has_realm_law = tribal_authority_3 + } + } + } + } + trigger_else_if = { + limit = { scope:target = { realm_law_use_celestial_bureaucracy = yes } } + custom_description = { + text = has_lowest_celestial_bureaucracy + subject = scope:target + scope:target = { + OR = { + has_realm_law = celestial_bureaucracy_1 + has_realm_law = celestial_bureaucracy_2 + has_realm_law = celestial_bureaucracy_3 + } + } + } + } + trigger_else_if = { + limit = { scope:target = { realm_law_use_meritocratic_bureaucracy = yes } } + custom_description = { + text = has_lowest_meritocratic_bureaucracy + subject = scope:target + scope:target = { + OR = { + has_realm_law = meritocratic_bureaucracy_1 + has_realm_law = meritocratic_bureaucracy_2 + has_realm_law = meritocratic_bureaucracy_3 + } + } + } + } + trigger_else_if = { + limit = { scope:target = { realm_law_use_japanese_bureaucracy = yes } } + custom_description = { + text = has_lowest_japanese_bureaucracy + subject = scope:target + scope:target = { + OR = { + has_realm_law = japanese_bureaucracy_1 + has_realm_law = japanese_bureaucracy_2 + has_realm_law = japanese_bureaucracy_3 + } + } + } + } + trigger_else = { + custom_description = { + text = has_lowest_crown_authority + subject = scope:target + scope:target = { + OR = { + has_realm_law = crown_authority_1 + has_realm_law = crown_authority_2 + has_realm_law = crown_authority_3 + } + } + } + } + + trigger_if = { + limit = { + scope:target = { government_has_flag = government_is_administrative } + } + scope:target = { + top_liege = this + } + } + } + + can_character_create = { + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + has_valid_realm_laws_for_liberty_faction_trigger = { + TARGET = scope:target + } + + trigger_if = { + limit = { + scope:target = { government_allows = administrative } + } + scope:target = { + top_liege = this + } + } + } + + can_character_join = { + common_can_character_join_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + OR = { + is_ai = no + has_valid_realm_laws_for_liberty_faction_trigger = { + TARGET = scope:faction.faction_target + } + } + + trigger_if = { + limit = { + scope:faction.faction_target = { government_allows = administrative } + } + scope:faction.faction_target = { + top_liege = this + } + } + } + + can_character_become_leader = { + can_become_leader_of_faction_trigger = yes + } + + ai_create_score = { + base = 0 # Join Weight is set primarily based on what Crown Laws a realm has. + + ############ + # BLOCKERS # + ############ + common_create_faction_blockers = { + FACTION_TARGET = scope:target + FLAG = recent_liberty_faction_war + } + + ####################### + # Standard AI Weights # + # + # Modifiers for Liberty Factions are inherently small. + # This is because Liberty is the 'Default Faction' that vassals are join if they don't want/can't join any other faction. + # 'Base Join Weight' depends on the current Crown Authority level. + common_faction_modifiers = { + FACTION_TARGET = scope:target + OPINION_MULTIPLIER = -1 + MAX_OPINION = 0 + POWER = 0 + THRESHOLD = 80 + } + + liberty_faction_modifiers = { + FACTION_TARGET = scope:target + } + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + } + + ai_join_score = { + base = 0 # Join Weight is set primarily based on what Crown Laws a realm has. + + ############ + # BLOCKERS # + common_join_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + } + + ####################### + # Standard AI Weights # + #AI + # Modifiers for Liberty Factions are inherently small. + # This is because Liberty is the 'Default Faction' that vassals are join if they don't want/can't join any other faction. + common_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + OPINION_MULTIPLIER = -1 + MAX_OPINION = 0 + POWER = scope:faction.faction_power + THRESHOLD = scope:faction.faction_power_threshold + } + + liberty_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + } + + struggle_faction_modifiers = yes + + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:faction.faction_target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + #EP3 admin legitimacy event + modifier = { + desc = "FACTION_REASON_LOW_LEGITIMACY_CHALLENGER" + add = 25 + scope:faction = { + any_faction_member = { + has_character_flag = low_legitimacy_admin_factions_flag + } + } + } + } + + on_creation = { + save_scope_as = faction + tgp_bloc_members_join_faction_effect = yes + if = { + limit = { + any_player = { + has_government = landless_adventurer_government + is_within_diplo_range = { CHARACTER = scope:faction.faction_target } + OR = { + has_contact = scope:faction.faction_leader + NOT = { has_contact = scope:faction.faction_target } + } + any_character_task_contract = { + task_contract_type = laamp_join_faction_contract + count <= 3 + } + can_create_task_contract = { + type_name = laamp_join_faction_contract + employer = scope:faction.faction_leader + } + save_temporary_scope_as = player_laamp + } + } + scope:player_laamp = { + create_task_contract = { + task_contract_type = laamp_join_faction_contract + task_contract_tier = scope:faction.faction_leader.task_contract_tier_value + location = scope:faction.faction_leader.primary_title.title_province + task_contract_employer = scope:faction.faction_leader + target = scope:faction.faction_target + } + } + } + } + + county_allow_join = no + county_allow_create = no +} + +claimant_faction = { + casus_belli = claimant_faction_war + + short_effect_desc = claimant_faction_short_effect_desc + + sort_order = 1 + + show_special_title = yes + name = FACTION_CLAMAINT_DYNAMIC_NAME + + character_interaction = create_claimant_faction_against_interaction + + claimant = yes + + is_shown = { + NAND = { + tgp_is_ceremonial_liege_trigger = yes + tgp_is_ceremonial_regent_trigger = no + } + } + + discontent_progress = { + base = 0 + + common_discontent_progress_modifier = yes + } + + power_threshold = { + base = 80 + + modifier = { + add = 20 + faction_target = { + has_perk = hard_rule_perk + } + desc = "FACTION_POWER_HARD_RULE" + } + + #Lower the threshold depending on the state of other factions + dynamic_power_threshold_scripted_modifier = { + FACTION_TYPE1 = liberty_faction + FACTION_TYPE2 = independence_faction + FACTION_TYPE3 = populist_faction + } + } + + is_valid = { # If the FACTION itself is valid + # see also invalidate_claimant_factions_on_death_effect for what happens when the claimant dies + + trigger_if = { + limit = { + OR = { + exists = special_character + exists = faction_war + } + } + special_title.holder ?= faction_target + special_title.holder ?= { tgp_is_ceremonial_regent_trigger = no } + OR = { + special_character ?= { + is_alive = yes + #has_claim_on = root.special_title + NOR = { + has_trait = incapable + this = root.faction_target + } + # Under Byzantine law, a ruler must be unblemished + trigger_if = { + limit = { + root.special_title.holder.culture ?= { has_cultural_parameter = physical_disfigurement_blocks_inheritance } + } + custom_description = { + text = "byzantine_claimant_is_disfigured" + object = this + valid_for_byz_succession_trigger = yes + } + } + trigger_if = { #If they're imprisoned by the faction target they can only be so for five years before invalidating + limit = { + is_imprisoned_by = root.faction_target + } + time_in_prison_type = { + years < 5 + } + } + # Ministers cannot be claimants unless we are targeting h_china + trigger_if = { + limit = { + OR = { + has_title = title:e_minister_chancellor + has_title = title:e_minister_censor + has_title = title:e_minister_grand_marshal + has_title = title:e_minister_of_personnel + has_title = title:e_minister_of_revenue + has_title = title:e_minister_of_rites + has_title = title:e_minister_of_war + has_title = title:e_minister_of_justice + has_title = title:e_minister_of_works + } + } + custom_description = { + text = target_is_a_minister_desc + subject = this + root.special_title = { this = title:h_china } + } + } + } + exists = faction_war + } + } + } + + demand = { # The effect of pressing demand + save_scope_as = faction + + faction_leader = { + save_scope_as = faction_leader + } + + faction_target = { + save_scope_as = faction_target + } + + special_character = { + save_scope_as = faction_claimant + } + + special_title = { + save_scope_as = faction_targeted_title + } + + # Let the human players in the faction know that the demand will be sent + every_faction_member = { + limit = { + is_ai = no + this != scope:faction.faction_leader + } + trigger_event = faction_demand.2005 + } + + # Send the actual demand in 5 days + faction_target = { + trigger_event = { + id = faction_demand.2001 + days = 5 + } + } + } + + ai_demand_chance = { + base = 0 + + #Won't send ultimatum if the claimant is imprisoned by the faction-target! + modifier = { + add = -500 + faction_target = { + any_prisoner = { + this = root.special_character + } + } + } + + # Won't start a war is the Realm is fighting against a Dissolution faction or Independent factions: you want to get the best realm possible. Better wait a bit longer + modifier = { + add = -1000 + faction_target = { + any_character_war = { + OR = { + using_cb = independence_faction_war + using_cb = independence_war + using_cb = nation_fracturing_faction_war + } + } + } + } + + # 40% base chance at minimum power (80%), increasing linearly + compare_modifier = { + value = faction_power + multiplier = 0.5 + } + + # Once the faction has a good chance to win (10% stronger than liege) demand chance increases much more rapidly. + compare_modifier = { + trigger = { faction_power > 110 } + value = faction_power + multiplier = 1 + } + + # Less likely if already in a war with an external ruler + modifier = { + add = -50 + faction_target = { + any_war_enemy = { + NOT = { + target_is_liege_or_above = root.faction_target + } + } + } + } + + modifier = { + add = -1000 + faction_target = { + involved_activity ?= { + has_activity_type = activity_coronation + activity_host = prev + } + } + } + } + + on_war_start = { + every_faction_member = { + limit = { + has_variable = gathered_support_for_faction + var:gathered_support_for_faction = root + } + spawn_army = { + name = gathered_support_for_faction_army + levies = { + value = this.massive_influence_value + multiply = 3 + } + men_at_arms = { + type = light_footmen + stacks = 2 + } + location = this.location + war = root.faction_war + inheritable = yes + } + } + } + + is_character_valid = { # Is the character valid to stay in the faction? This is also checked when creating it... + common_character_validity_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + + trigger_if = { + limit = { + government_allows = administrative + } + scope:faction.faction_target ?= { + OR = { + top_liege ?= this + NOT = { government_allows = administrative } + } + } + } + + # TGP - Use Coup against Kampaku instead + trigger_if = { + limit = { + scope:faction.faction_target ?= top_liege + } + scope:faction.faction_target ?= { + tgp_is_ceremonial_regent_trigger = no + } + } + has_valid_faction_members_trigger = yes + } + + can_character_create_ui = { + is_character_interaction_valid = { + recipient = scope:target + interaction = create_claimant_faction_against_interaction + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + # TGP - Use Coup against Kampaku instead + custom_tooltip = { + text = cannot_create_claimant_faction_against_kampaku_tooltip + scope:target = { + # TGP - Use Coup against Kampaku instead + tgp_is_ceremonial_regent_trigger = no + } + } + } + + can_character_create = { # If a character is allowed to create the faction. The 'is_character_valid' block is also checked in conjunction with this when creating a faction. + + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + # TGP - Use Coup against Kampaku instead + trigger_if = { + limit = { + exists = joined_faction + joined_faction.special_title.holder ?= { + this = scope:target + } + } + joined_faction.special_title.holder ?= { + tgp_is_ceremonial_regent_trigger = no + } + } + # TGP - Use Coup against Kampaku instead + trigger_else_if = { + limit = { + has_variable = claiming_title + var:claiming_title.holder ?= { + this = scope:target + } + } + var:claiming_title.holder ?= { + tgp_is_ceremonial_regent_trigger = no + } + } + trigger_else = { + always = no + } + } + + can_character_join = { # Can a character join an existing faction? + common_can_character_join_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + } + + can_character_become_leader = { + can_become_leader_of_faction_trigger = yes + } + + ai_create_score = { # How likely is an AI to create a faction? + base = -25 + + #### + # BLOCKERS + #### + common_create_faction_blockers = { + FACTION_TARGET = scope:target + FLAG = none + } + + claimant_faction_blockers = { + FACTION_TARGET = scope:target + FACTION_CLAIMANT = scope:claimant + } + + #### + # AI modifiers + #### + common_faction_modifiers = { + FACTION_TARGET = scope:target + OPINION_MULTIPLIER = -1.5 + MAX_OPINION = 150 + POWER = 0 + THRESHOLD = 80 + } + + claimant_faction_modifiers = { + FACTION_TARGET = scope:target + FACTION_CLAIMANT = scope:claimant + FACTION_TITLE = scope:title + } + + admin_faction_modifiers = { + FACTION_TARGET = scope:target + FACTION_TYPE = claimant_faction + } + + admin_claimant_faction_modifiers = { + FACTION_TARGET = scope:target + FACTION_CLAIMANT = scope:claimant + } + } + + ai_join_score = { # How likely is an AI to join an existing faction? + base = -25 + + common_join_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + } + + claimant_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + FACTION_CLAIMANT = scope:faction.special_character + } + + common_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + OPINION_MULTIPLIER = -1 + MAX_OPINION = 100 + POWER = scope:faction.faction_power + THRESHOLD = scope:faction.faction_power_threshold + } + + claimant_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + FACTION_CLAIMANT = scope:faction.special_character + FACTION_TITLE = scope:faction.special_title + } + + admin_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + FACTION_TYPE = claimant_faction + } + + admin_claimant_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + FACTION_CLAIMANT = scope:faction.special_character + } + + # Faction 'Stacking' Factors, attempts to cluster AI rulers into several powerful factions instead of many weak ones. + join_faction_stacking_modifiers = yes + + modifier = { # CE1 Divine Mandate perk + desc = "FACTION_REASON_LEGITIMACY_LEGACY_4" + liege.dynasty = { has_dynasty_perk = ce1_legitimacy_legacy_4 } + add = -10 + } + + struggle_faction_modifiers = yes + + #EP3 admin legitimacy event + modifier = { + desc = "FACTION_REASON_LOW_LEGITIMACY_CHALLENGER" + add = 25 + scope:faction = { + any_faction_member = { + has_character_flag = low_legitimacy_admin_factions_flag + } + } + } + + #EP3 King of England disgruntled vassals/life threatened modifiers + modifier = { + desc = "FACTION_REASON_CLAIMANT_DISGRUNTLED_VASSALS" + add = 25 + liege = { + has_character_modifier = ep3_disgruntled_vassals_modifier + } + } + modifier = { + desc = "FACTION_REASON_CLAIMANT_DISGRUNTLED_VASSALS" + add = 25 + liege = { + has_character_modifier = ep3_life_threatened_modifier + } + } + } + + is_county_valid = { + scope:faction.faction_target = holder + } + + can_county_join = { + # Counties can only join if the De Jure belong to the title being claimed. + exists = scope:faction.special_title + target_is_de_jure_liege_or_above = scope:faction.special_title + } + + county_join_score = { + base = -80 # Needs to be less than the weight set in 00_populist_faction.txt, or counties will never join a claimant faction over a populist faction. + + # Up to +3 join score per negative opinion (+80 at -27 opinion) if different culture. + compare_modifier = { + desc = "FACTION_REASON_CLAIMANT_COUNTY_SHARED_CULTURE" + trigger = { + scope:faction.faction_target.culture != this.title_province.culture + scope:faction.special_character.culture = this.title_province.culture + } + value = county_opinion + multiplier = -2.0 + } + compare_modifier = { + desc = "FACTION_REASON_CLAIMANT_COUNTY_SHARED_HERITAGE" + trigger = { + NOT = { this.title_province.culture = { has_same_culture_heritage = scope:faction.faction_target.culture } } + this.title_province.culture = { has_same_culture_heritage = scope:faction.special_character.culture } + } + value = county_opinion + multiplier = -2.0 + } + + # If we have better relations with the claimant's faith than our current liege's, gain up to +5 join score per negative opinion (at Righteous) down to +1 join score per negative opinion (at Hostile). + compare_modifier = { + desc = "FACTION_REASON_LIKE_CLAIMANT_FAITH" + trigger = { + faith = { + faith_hostility_level_comparison = { + scope:faction.faction_target.faith > scope:faction.special_character.faith + } + } + } + value = county_opinion + multiplier = { + value = 0.0 + if = { + limit = { + faith = { + faith_hostility_level = { + target = scope:faction.special_character.faith + value = faith_hostile_level + } + } + } + value = -1.0 # Hostile + } + else_if = { + limit = { + faith = { + faith_hostility_level = { + target = scope:faction.special_character.faith + value = faith_astray_level + } + } + } + value = -3.0 # Astray + } + else = { + value = -5.0 # Righteous + } + } + } + + legalism_virtue_and_sin_modifier = { + TARGET = scope:faction.faction_target + SCORE_PER_TRAIT = 50 # Worth ~12 opinion per virtue. + } + + # Greatly reduced chance for a character's capital county to form a faction against them (extra -25 opinion needed). + modifier = { + desc = "FACTION_REASON_CAPITAL_COUNTY" + add = -200 + this.title_province = scope:faction.faction_target.capital_province + } + + # More likely to support adult claimants when a child is on the throne. + modifier = { + desc = "FACTION_REASON_ADULT_CLAIMANT_CHILD_RULER" + add = 10 + exists = scope:faction.faction_target + exists = scope:faction.special_character + scope:faction.faction_target = { is_adult = no } + scope:faction.special_character = { is_adult = yes } + } + + # Peasants perfer magnanimous rulers over harsh or cruel ones. + compare_modifier = { + desc = "FACTION_REASON_CLAIMANT_KINDNESS" + factor = { + # Gets a value between 0 (max greedy/dishonorable/vengeful/cruel) and 800 (max honorable/compassionate/generous/forgiving). + value = 400 + add = scope:faction.special_character.ai_honor + add = scope:faction.special_character.ai_compassion + subtract = scope:faction.special_character.ai_greed + subtract = scope:faction.special_character.ai_vengefulness + + # Converts the personality score into a percentage between 0% (will never support) and 100% (really wants to support) + divide = 800 + } + + # How big the factor is for supporting this claimant over other factions at max support. + multiplier = 2 + } + } + + on_creation = { + save_scope_as = faction + tgp_bloc_members_join_faction_effect = yes + if = { + limit = { + any_player = { + has_government = landless_adventurer_government + is_within_diplo_range = { CHARACTER = scope:faction.faction_target } + OR = { + has_contact = scope:faction.faction_leader + has_contact = scope:faction.special_character + NOT = { has_contact = scope:faction.faction_target } + } + any_character_task_contract = { + task_contract_type = laamp_join_faction_contract + count <= 3 + } + can_create_task_contract = { + type_name = laamp_join_faction_contract + employer = scope:faction.faction_leader + } + save_temporary_scope_as = player_laamp + } + } + scope:player_laamp = { + create_task_contract = { + task_contract_type = laamp_join_faction_contract + task_contract_tier = scope:faction.faction_leader.task_contract_tier_value + location = scope:faction.faction_leader.primary_title.title_province + task_contract_employer = scope:faction.faction_leader + target = scope:faction.faction_target + } + } + } + } + + county_allow_join = yes + county_allow_create = no + county_power = county_levies_to_raise + + character_allow_create = yes + + character_allow_join = yes + + multiple_targeting = yes + + special_character_title = "FACTIONS_WINDOW_CLAIMANT" + + ignore_soft_block = yes +} diff --git a/N3OW/common/factions/00_nation_fracturing_faction.txt b/N3OW/common/factions/00_nation_fracturing_faction.txt new file mode 100644 index 00000000..0ec024c1 --- /dev/null +++ b/N3OW/common/factions/00_nation_fracturing_faction.txt @@ -0,0 +1,407 @@ +nation_fracturing_faction = { + casus_belli = nation_fracturing_faction_war + + short_effect_desc = nation_fracturing_faction_short_effect_desc + + sort_order = 0 + + is_shown = { + NAND = { + tgp_is_ceremonial_liege_trigger = yes + tgp_is_ceremonial_regent_trigger = no + } + } + + discontent_progress = { + base = 0 + + common_discontent_progress_modifier = yes + } + + power_threshold = { + base = 80 + + modifier = { + add = 20 + faction_target = { + has_perk = hard_rule_perk + } + desc = "FACTION_POWER_HARD_RULE" + } + + dynamic_power_threshold_scripted_modifier = { + FACTION_TYPE1 = claimant_faction + FACTION_TYPE2 = liberty_faction + FACTION_TYPE3 = populist_faction + } + } + + is_character_valid = { + common_character_validity_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + has_valid_faction_members_trigger = yes + } + + demand = { + save_scope_as = faction + + faction_leader = { + save_scope_as = faction_leader + } + + faction_target = { + save_scope_as = faction_target + } + + # Let the human players in the faction know that the demand will be sent + every_faction_member = { + limit = { + is_ai = no + this != scope:faction.faction_leader + } + trigger_event = faction_demand.1005 + } + + # Send the actual demand in 5 days + faction_target = { + trigger_event = { + id = faction_demand.1000 + days = 5 + } + } + } + + can_character_create_ui = { + base_faction_trigger = { FACTION_TYPE = nation_fracturing_faction } + + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + liege = { + top_liege = this + NOT = { government_has_flag = government_is_theocracy } + custom_tooltip = { + text = nation_fracturing_faction.can_character_create_ui.blocked_by_struggle + # We could use a parameter but this is just infinitely more performant. + NOT = { + any_held_title = { has_variable = struggle_block_dissolution_faction } + } + } + } + + # Only powerful vassals can create such factions and they need to have either another culture or faith + OR = { + is_powerful_vassal = yes + government_has_flag = government_is_nomadic + is_ai = no + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + # Muslims vassals cannot create or join against Dar al-Islam + trigger_if = { + limit = { + scope:target = { has_title = title:h_dar_al_islam } + } + custom_tooltip = { + text = dar_al_islam_faction_block_desc + NOT = { faith.religion = religion:islam_religion } + } + } + } + + can_character_create = { + common_can_character_create_trigger = { + FACTION_TARGET = scope:target + } + # Bloc Cohesion requirement + japan_faction_cohesion_trigger = yes + + liege = { + top_liege = this + NOT = { government_has_flag = government_is_theocracy } + custom_tooltip = { + text = nation_fracturing_faction.can_character_create_ui.blocked_by_struggle + # We could use a parameter but this is just infinitely more performant. + NOT = { + any_held_title = { has_variable = struggle_block_dissolution_faction } + } + } + } + + # Only powerfull vassals can create such factions and they need to have either another culture or faith + OR = { + is_powerful_vassal = yes + is_ai = no + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + + # Muslims vassals cannot create or join against Dar al-Islam + trigger_if = { + limit = { + scope:target = { has_title = title:h_dar_al_islam } + } + custom_tooltip = { + text = dar_al_islam_faction_block_desc + NOT = { faith.religion = religion:islam_religion } + } + } + } + + ai_create_score = { + base = -200 # Base reluctance value we must overcome to start an Independence Faction. + + ############ + # BLOCKERS # + common_create_faction_blockers = { + FACTION_TARGET = scope:target + FLAG = recent_nation_fracturing_faction_war + } + + nation_fracturing_faction_blockers = { + FACTION_TARGET = scope:target + } + + ####################### + # Standard AI Weights # + + common_faction_modifiers = { + FACTION_TARGET = scope:target + OPINION_MULTIPLIER = -2 + MAX_OPINION = 200 + POWER = 0 + THRESHOLD = 80 + } + + nation_fracturing_faction_modifiers = { + FACTION_TARGET = scope:target + } + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + } + + can_character_join = { + common_can_character_join_trigger = { + FACTION_TARGET = scope:faction.faction_target + } + + trigger_if = { + limit = { + faith.religion = religion:islam_religion + liege = { has_title = title:d_sunni } + title:d_sunni = { + has_variable = dar_al_islam + } + } + liege = { + NOT = { + has_title = title:d_sunni + } + } + } + + + # Muslims vassals cannot create or join against Dar al-Islam + trigger_if = { + limit = { + scope:faction.faction_target = { has_title = title:h_dar_al_islam } + } + custom_tooltip = { + text = dar_al_islam_faction_block_desc + NOT = { faith.religion = religion:islam_religion } + } + } + } + + can_character_become_leader = { + can_become_leader_of_faction_trigger = yes + } + + ai_join_score = { + base = -150 # Base reluctance value we must overcome to join an Independence Faction. + + ############ + # BLOCKERS # + + common_join_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + } + + nation_fracturing_faction_blockers = { + FACTION_TARGET = scope:faction.faction_target + } + + ####################### + # Standard AI Weights # + + common_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + OPINION_MULTIPLIER = -2 + MAX_OPINION = 100 + POWER = scope:faction.faction_power + THRESHOLD = scope:faction.faction_power_threshold + } + + nation_fracturing_faction_modifiers = { + FACTION_TARGET = scope:faction.faction_target + } + + modifier = { # CE1 Divine Mandate perk + desc = "FACTION_REASON_LEGITIMACY_LEGACY_4" + liege.dynasty = { has_dynasty_perk = ce1_legitimacy_legacy_4 } + add = -35 + } + #House Hostility from Armenian tradition + modifier = { + desc = "FACTION_REASON_HOUSE_HOSTILITY" + + scope:target.house ?= { + this != root.house + } + culture = { has_cultural_parameter = house_hostility_more_common } + + factor = 1.25 + } + #EP3 admin legitimacy event + modifier = { + desc = "FACTION_REASON_LOW_LEGITIMACY_CHALLENGER" + add = 25 + scope:faction = { + any_faction_member = { + has_character_flag = low_legitimacy_admin_factions_flag + } + } + } + } + + ai_demand_chance = { + base = 0 + + # 40% base chance at minimum power (80%), increasing linearly + compare_modifier = { + value = faction_power + multiplier = 0.5 + } + + # Once the faction has a good chance to win (10% stronger than liege) demand chance increases much more rapidly. + compare_modifier = { + trigger = { faction_power > 110 } + value = faction_power + multiplier = 1 + } + + modifier = { + add = 100 + faction_target = { + is_at_war = yes # Independence Factions are opportunistic bastards! + } + } + + modifier = { + add = -1000 + faction_target = { + involved_activity ?= { + has_activity_type = activity_coronation + activity_host = prev + } + } + } + } + + + county_join_score = { + base = 0 + compare_modifier = { + desc = "FACTION_REASON_COUNTY_OPINION" + value = county_opinion + multiplier = -1.0 + } + } + + is_county_valid = { + holder = scope:faction.faction_target + OR = { + culture != scope:faction.faction_target.culture + faith != scope:faction.faction_target.faith + } + } + + on_creation = { + save_scope_as = faction + if = { + limit = { + any_player = { + has_government = landless_adventurer_government + is_within_diplo_range = { CHARACTER = scope:faction.faction_target } + NOT = { has_contact = scope:faction.faction_target } + OR = { + faith = scope:faction.faction_target.faith + culture = scope:faction.faction_target.culture + } + any_character_task_contract = { + task_contract_type = laamp_join_faction_contract + count <= 3 + } + can_create_task_contract = { + type_name = laamp_join_faction_contract + employer = scope:faction.faction_leader + } + save_temporary_scope_as = player_laamp + } + } + scope:player_laamp = { + create_task_contract = { + task_contract_type = laamp_join_faction_contract + task_contract_tier = scope:faction.faction_leader.task_contract_tier_value + location = scope:faction.faction_leader.primary_title.title_province + task_contract_employer = scope:faction.faction_leader + target = scope:faction.faction_target + } + } + } + } + + county_allow_join = yes + county_allow_create = no +}