N3OW/common/factions/00_populist_faction.txt
2026-05-30 00:59:58 -04:00

1825 lines
45 KiB
Text

populist_faction = {
casus_belli = populist_war
leaders_allowed_to_leave = no
player_can_join = no
sort_order = 3
name = FACTION_POPULIST_DYNAMIC_NAME
short_effect_desc = {
first_valid = {
triggered_desc = {
trigger = {
faction_target = { government_has_flag = government_is_administrative }
}
desc = populist_faction_short_effect_desc_admin
}
desc = populist_faction_short_effect_desc
}
}
discontent_progress = {
base = 0
common_discontent_progress_modifier = yes
modifier = {
faction_target = { can_vassals_be_attacked = yes }
add = 2
desc = border_war_increased_peasant_discontent
}
modifier = {
faction_target = {
top_participant_group:dynastic_cycle ?= {
has_participant_group_parameter = dynastic_cycle_more_peasant_factions
}
}
add = 2
desc = instability_increased_peasant_discontent
}
}
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 = liberty_faction
}
}
requires_county = yes
requires_character = no
# Faction existence is valid
is_valid = {
trigger_if = {
limit = {
exists = special_character
}
special_character = {
is_alive = yes
}
}
}
###########
# Counties/characters are allowed to exist in the faction at all (will be kicked out if they fail these checks while already in it).
is_character_valid = {
has_valid_faction_members_trigger = yes
# Only AIs are allowed to be in popular factions.
is_ai = yes
# Landed rulers can only be in the faction...
trigger_if = {
limit = {
is_playable_character = yes
exists = liege
this != liege
}
# ... If they are a direct vassal of the faction target.
liege = scope:faction.faction_target
# ... If they are at least a count. (Barons are not allowed.)
highest_held_title_tier >= tier_county
}
# Must not be the same culture & faith as the faction target.
custom_tooltip = {
text = populist_faction_same_culture_faith_as_liege
OR = {
faith != scope:faction.faction_target.faith
culture != scope:faction.faction_target.culture
}
}
trigger_if = { # Must have a different faith than state faith in Admin
limit = {
exists = scope:faction.faction_target.primary_title.state_faith
}
faith != scope:faction.faction_target.primary_title.state_faith
}
# Not forbidden from being in factions.
NOT = {
has_character_flag = joining_faction_block
}
is_imprisoned = no
}
is_county_valid = {
# Counties can only be in a faction against the top liege in their realm (who is inherently independent).
scope:faction.faction_target = holder.top_liege
# Counties must have a different faith or culture than the faction target.
OR = {
faith != scope:faction.faction_target.faith
culture != scope:faction.faction_target.culture
}
trigger_if = { # Must have a different faith than state faith in Admin
limit = {
exists = scope:faction.faction_target.primary_title.state_faith
}
faith != scope:faction.faction_target.primary_title.state_faith
}
# Counties must have the same faith as the faction
scope:faction = {
OR = {
NOT = {
has_variable = faction_faith
}
AND = {
has_variable = faction_faith
root.faith = var:faction_faith
}
}
}
# Player capitals are blocked from joining populist factions (to avoid Game Overing a player due to a populist uprising against their liege, which as a vassal they can't really prevent or fight)
save_temporary_scope_as = this_county
trigger_if = {
limit = {
holder = {
is_ai = no
}
}
this != holder.capital_county
}
title_province = {
NOR = {
has_holding_type = nomad_holding
has_holding_type = herder_holding
}
}
}
###########
# Counties/characters are allowed to create/join the faction (but will remain in faction if they fail these after joining).
can_character_join = {
# Must share this faction's faith.
scope:faction = {
has_variable = faction_faith
root.faith = var:faction_faith
}
}
can_county_join = {
# Must share this faction's faith.
scope:faction = {
OR = {
NOT = {
has_variable = faction_faith
}
AND = {
has_variable = faction_faith
root.faith = var:faction_faith
}
}
trigger_if = { # Must have a different faith than state faith in Admin
limit = {
exists = scope:faction.faction_target.primary_title.state_faith
}
root.faith != scope:faction.faction_target.primary_title.state_faith
}
}
title_province = {
NOR = {
has_holding_type = nomad_holding
has_holding_type = herder_holding
}
}
}
can_county_create = {
county_opinion < 0
# Can only join factions against our top liege (not direct liege)
scope:target = holder.top_liege
# Must have a culture or faith different from the target's.
OR = {
#make sure you do not accept their faith
faith ?= {
faith_hostility_level = {
target = scope:target.faith
value > faith_fully_accepted_level
}
}
culture != scope:target.culture
}
trigger_if = { # Must have a different faith than state faith in Admin
limit = {
exists = scope:faction.faction_target.primary_title.state_faith
}
faith != scope:faction.faction_target.primary_title.state_faith
}
####
# BLOCKERS
####
# General Faction immunity
custom_description = {
text = character_is_immune_to_factions
subject = scope:target
NOT = { scope:target = { immune_to_factions_trigger = yes } }
}
title_province = {
NOR = {
has_holding_type = nomad_holding
has_holding_type = herder_holding
}
}
}
can_character_become_leader = {
has_variable = rebel_leader_peasants
var:rebel_leader_peasants = scope:faction
}
###########
# Counties/characters are *willing* to join or remain in the faction (not blocked from being in the faction, but unless these are true they will not join the faction unless forced).
county_create_score = {
base = -160 # Counties can't create a new faction unless opinion is less than -20 (see summary below).
# If a suitable Popular Faction already exists (of the same faith), side with it instead.
modifier = {
add = -1000
scope:target = {
any_targeting_faction = {
faction_type = populist_faction
any_faction_county_member = {
this.title_province.faith = root.title_province.faith
}
}
}
}
# If a suitable Escalated Faction exists, prefer to join it instead.
modifier = {
desc = "FACTION_REASON_PREFER_ESCALATED_FACTION"
add = -100
scope:target = {
any_targeting_faction = {
faction_type = escalated_peasant_faction
}
}
}
# Summary of score weights (base + modifiers):
# Different Culture Group + Evil Faith: 100% chance at -32 opinion, 1% chance at -19 opinion
# Different Culture (Same Group) + Hostile Faith: 90% chance at -100 opinion, 1% chance at -46 opinion
# Different Culture AND Astray Faith: 40% chance at -100 opinion, 1% chance at -80 opinion
# Different Culture OR Astray Faith: Never Creates
compare_modifier = {
trigger = {
this.title_province.culture != scope:target.culture
this.title_province.culture = { has_same_culture_heritage = scope:target.culture }
}
value = county_opinion
multiplier = -1.0
}
compare_modifier = {
trigger = {
NOT = { this.title_province.culture = { has_same_culture_heritage = scope:target.culture } }
}
value = county_opinion
multiplier = -3.0
}
pluralism_fundamentalism_dual_modifier = {
ASTRAY_BASE_VALUE = faction_county_opinion_astray
HOSTILE_BASE_VALUE = faction_county_opinion_hostile
EVIL_BASE_VALUE = faction_county_opinion_evil
BASE_FAITH = faith
TARGET = scope:target
}
pluralism_fundamentalism_modifier = {
ASTRAY_BASE_VALUE = faction_county_opinion_astray
HOSTILE_BASE_VALUE = faction_county_opinion_hostile
EVIL_BASE_VALUE = faction_county_opinion_evil
BASE_FAITH = faith
TARGET = scope:target
}
# Greatly reduced chance for a character's capital county to form a faction against them (extra -25 opinion needed).
modifier = {
add = -200
this.title_province = scope:target.capital_province
}
legalism_virtue_and_sin_modifier = {
TARGET = scope:target
SCORE_PER_TRAIT = 50 # Worth ~12 opinion per trait.
}
liege_debt_modifier = {
TARGET = scope:target
SCORE_PER_DEBT_LEVEL = 20 # Worth ~5 opinon per debt level, up to a max of 140 (-35 opinion)
}
# Ruling Caste
modifier = {
add = -25
culture != scope:target.culture
scope:target.culture = {
has_cultural_parameter = peasant_and_populist_factions_less_common
}
}
# Defiant Ambushers
modifier = {
add = 25
county_opinion < 0
culture != scope:target.culture
culture = { has_cultural_parameter = county_peasant_and_populist_factions_more_common }
}
# Realm Stability Settings
modifier = {
add = 50
has_game_rule = lesser_realm_stability
}
modifier = {
add = -100
has_game_rule = higher_realm_stability
}
modifier = {
add = -200
has_game_rule = extreme_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 50
has_game_rule = lesser_realm_stability_ai_only
scope:target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -100
has_game_rule = higher_realm_stability_ai_only
scope:target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -200
has_game_rule = extreme_realm_stability_ai_only
scope:target = {
is_ai = yes
}
}
# Conquerors
modifier = {
add = -100
scope:target = { ai_should_get_conqueror_bonuses = yes }
}
modifier = {
add = -200
scope:target = { ai_should_get_extreme_conqueror_bonuses = yes }
}
# 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_more_peasant_factions
}
}
}
# 10-year 'grace period' from populist factions forming after game start
modifier = {
years_from_game_start <= 10
factor = {
value = 0
if = {
limit = { years_from_game_start >= 5 }
add = years_from_game_start
subtract = 5
divide = 5 # In year 6 factions can begin forming, but at 20% weighting. This increases to 40% in year 7, 60% in year 8, etc., up to 100% in year 10 where things are then normal.
}
}
}
}
county_join_score = {
base = -120 # Counties won't join unless opinion is less than -15 (see summary below).
modifier = {
add = -1000
# Do not join if we have nothing to gain (already share Liege faith and will not share new liege Culture (Group)).
AND = {
# We already share a Faith with the Top Liege.
title_province.faith = scope:faction.faction_target.faith
# And we do NOT share a Culture Group with the faction leader.
NOT = { this.title_province.culture = { has_same_culture_heritage = scope:faction.var:faction_culture } }
}
}
# If a suitable Escalated Faction exists, prefer to join it instead.
modifier = {
desc = "FACTION_REASON_PREFER_ESCALATED_FACTION"
add = -100
scope:faction.faction_target = {
any_targeting_faction = {
faction_type = escalated_peasant_faction
}
}
}
# Summary of score weights (base + modifiers):
# Different Culture Group + Evil Faith: 100% chance at -28 opinion, 1% chance at -15 opinion
# Different Culture (Same Group) + Hostile Faith: 100% chance at -88 opinion, 1% chance at -34 opinion
# Different Culture (Same Group) AND Astray Faith: 80% chance at -100 opinion, 1% chance at -60 opinion
# Different Culture (Same Group) OR Astray Faith: Never Joins
compare_modifier = {
desc = "FACTION_REASON_CULTURAL_REASONS"
trigger = {
NOR = {
this.title_province.culture = scope:faction.faction_target.culture
AND = {
scope:faction.faction_target = { has_active_diarchy = yes }
this.title_province.culture = scope:faction.faction_target.diarch.culture
}
}
OR = {
this.title_province.culture = { has_same_culture_heritage = scope:faction.faction_target.culture }
AND = {
scope:faction.faction_target = { has_active_diarchy = yes }
this.title_province.culture = { has_same_culture_heritage = scope:faction.faction_target.diarch.culture }
}
}
}
value = county_opinion
multiplier = -1.0
}
compare_modifier = {
desc = "FACTION_REASON_CULTURAL_REASONS"
trigger = {
NOR = {
this.title_province.culture = scope:faction.faction_target.culture
AND = {
scope:faction.faction_target = { has_active_diarchy = yes }
this.title_province.culture = scope:faction.faction_target.diarch.culture
}
}
}
value = county_opinion
multiplier = -3.0
}
pluralism_fundamentalism_dual_modifier = {
ASTRAY_BASE_VALUE = faction_county_opinion_astray
HOSTILE_BASE_VALUE = faction_county_opinion_hostile
EVIL_BASE_VALUE = faction_county_opinion_evil
BASE_FAITH = faith
TARGET = scope:faction.faction_target
}
pluralism_fundamentalism_modifier = {
ASTRAY_BASE_VALUE = faction_county_opinion_astray
HOSTILE_BASE_VALUE = faction_county_opinion_hostile
EVIL_BASE_VALUE = faction_county_opinion_evil
BASE_FAITH = faith
TARGET = scope:faction.faction_target
}
# Reduced chance for a character's capital county to join a faction against them (extra -10 opinion needed).
modifier = {
desc = "FACTION_REASON_CAPITAL_COUNTY"
add = -80
exists = scope:faction.faction_target.capital_province
this.title_province = scope:faction.faction_target.capital_province
}
legalism_virtue_and_sin_modifier = {
TARGET = scope:faction.faction_target
SCORE_PER_TRAIT = 50 # Worth ~12 opinion per virtue.
}
liege_debt_modifier = {
TARGET = scope:faction.faction_target
SCORE_PER_DEBT_LEVEL = 20 # Worth ~5 opinon per debt level, up to a max of 140 (-35 opinion)
}
# Ruling Caste
modifier = {
desc = "FACTION_REASON_RULING_CASTE"
add = -25
culture != scope:faction.faction_target.culture
scope:faction.faction_target.culture = {
has_cultural_parameter = peasant_and_populist_factions_less_common
}
}
# Defiant Ambushers
modifier = {
add = 25
county_opinion < 0
culture != scope:faction.faction_target.culture
culture = { has_cultural_parameter = county_peasant_and_populist_factions_more_common }
}
# Realm Stability Settings
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 50
has_game_rule = lesser_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -100
has_game_rule = higher_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -200
has_game_rule = extreme_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 50
has_game_rule = lesser_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -100
has_game_rule = higher_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -200
has_game_rule = extreme_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
# Conquerors
modifier = {
add = -100
scope:faction.faction_target = { ai_should_get_conqueror_bonuses = yes }
}
modifier = {
add = -200
scope:faction.faction_target = { ai_should_get_extreme_conqueror_bonuses = yes }
}
# Regent
modifier = {
desc = "FACTION_REASON_REGENT_CULTURAL_REASONS"
add = -100
scope:faction.faction_target.culture != culture
scope:faction.faction_target = { has_active_diarchy = yes }
scope:faction.faction_target.diarch.culture ?= culture
}
modifier = {
desc = "FACTION_REASON_REGENT_FAITH_REASONS"
add = -100
scope:faction.faction_target.faith != faith
scope:faction.faction_target = { has_active_diarchy = yes }
scope:faction.faction_target.diarch.faith ?= faith
}
# 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_more_peasant_factions
}
}
}
}
county_power = county_levies_to_raise
ai_join_score = {
base = -25
# Do not join a new faction if I am already at war.
modifier = {
add = -1000
AND = {
is_at_war = yes
trigger_if = {
limit = {
exists = joined_faction
}
joined_faction != scope:faction
}
}
}
modifier = {
add = -1000
# Do not join if we have nothing to gain (already share Liege faith and will not share new liege Culture (Group)).
AND = {
# We already share a Faith with the Top Liege.
faith = scope:faction.faction_target.faith
# And we do NOT share a Culture Group with the faction leader.
NOT = { culture = { has_same_culture_heritage = scope:faction.var:faction_culture } }
}
}
# Block characters from joining if they have a high opinion of the target
modifier = {
add = -1000
save_temporary_opinion_value_as = { name = target_opinion target = scope:faction.faction_target }
scope:target_opinion >= 80
}
# Opinion of the Liege
opinion_modifier = {
who = root
opinion_target = scope:faction.faction_target
multiplier = -1
}
# Not a de jure vassal or consequent part of the realm is out of the De Jure
modifier = {
desc = "FACTION_REASON_RIGHTFUL"
add = {
value = 125
# Larger realms are inherently more rebellious.
add = {
value = sub_realm_size
multiply = 2
}
}
OR = {
NOT = {
scope:faction.faction_target = {
is_rightful_liege_of = root
}
}
any_sub_realm_county = {
percent <= 0.5
save_temporary_scope_as = current_county
scope:faction.faction_target.primary_title = {
any_in_de_jure_hierarchy = {
this = scope:current_county
}
}
}
}
}
# Cultural and religious differences with liege
modifier = { # Between +50 and +100 based on culture
desc = "FACTION_REASON_CULTURAL_REASONS"
NOT = { culture = { has_same_culture_heritage = scope:faction.faction_target.culture } }
NOT = { culture = { has_cultural_parameter = doesnt_care_about_culture_faith_in_factions } }
culture = { has_same_culture_heritage = scope:faction.var:faction_culture }
add = {
value = 50
if = {
limit = {
culture != scope:faction.faction_target.culture
culture = scope:faction.var:faction_culture
}
add = 50
}
}
}
# Base values can range from +17.5 to +250 depending on hostility and pluralism/fundamentalism levels.
pluralism_fundamentalism_dual_modifier = {
ASTRAY_BASE_VALUE = 35
HOSTILE_BASE_VALUE = 75
EVIL_BASE_VALUE = 125
BASE_FAITH = faith
TARGET = scope:faction.faction_target
}
pluralism_fundamentalism_modifier = {
ASTRAY_BASE_VALUE = 35
HOSTILE_BASE_VALUE = 75
EVIL_BASE_VALUE = 125
BASE_FAITH = faith
TARGET = scope:faction.faction_target
}
legalism_virtue_and_sin_modifier = {
TARGET = scope:faction.faction_target
SCORE_PER_TRAIT = 25
}
liege_debt_modifier = {
TARGET = scope:faction.faction_target
SCORE_PER_DEBT_LEVEL = 10
}
# The AI is almost always unwilling to join a faction against their friends and lovers.
modifier = {
desc = "FACTION_REASON_TARGET_FRIEND_LOVER"
add = -250
OR = {
has_relation_lover = scope:faction.faction_target
has_relation_friend = scope:faction.faction_target
}
}
# Dread. Does not apply if the faction is above the power threshold
intimidated_from_faction_modifier = {
TARGET = scope:faction.faction_target
POWER = scope:faction.faction_power
THRESHOLD = scope:faction.faction_power_threshold
}
# Leader never leaves
modifier = {
desc = "FACTION_REASON_FACTION_LEADER"
has_variable = rebel_leader_peasants
add = 10000
}
# Ruling Caste
modifier = {
desc = "FACTION_REASON_RULING_CASTE"
add = -20
culture != scope:faction.faction_target.culture
scope:faction.faction_target.culture = {
has_cultural_parameter = peasant_and_populist_factions_less_common
}
}
# Realm Stability Settings
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 25
has_game_rule = lesser_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -50
has_game_rule = higher_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -100
has_game_rule = extreme_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 25
has_game_rule = lesser_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -50
has_game_rule = higher_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -100
has_game_rule = extreme_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
##########################
# Faction 'Stacking' Factors, attempts to cluster AI rulers into several powerful factions instead of many weak ones.
join_faction_stacking_modifiers = yes
# Small multiplier for my neighbors already in the Faction
modifier = {
desc = "FACTION_REASON_NEIGHBORS"
factor = {
value = 1
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
}
#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_more_peasant_factions
}
}
}
}
on_creation = {
random_faction_county_member = {
save_scope_as = founding_county
}
set_variable = {
name = faction_culture
value = scope:founding_county.culture
}
set_variable = {
name = faction_faith
value = scope:founding_county.faith
}
}
on_destroy = {
set_variable = {
name = peasant_destroying
value = yes
}
if = {
limit = { exists = special_character }
special_character = {
if = {
limit = {
OR = {
has_character_flag = peasant_faction_claimant_without_title
has_character_flag = peasant_faction_random_peasant
}
has_variable = peasant_title
}
if = {
limit = {
has_variable = peasant_title
}
destroy_title = this.var:peasant_title
}
if = {
limit = { # To make sure we aren't in debt
gold > 0
}
remove_long_term_gold = gold # Zero out our wallet since the revolt is over and we're going back to being unlanded.
}
}
if = {
limit = {
is_alive = yes # To prevent dead people from being checked for variables
}
if = {
limit = {
has_variable = rebel_leader_peasants
}
remove_variable = rebel_leader_peasants
}
remove_variable = peasant_title
remove_character_flag = peasant_faction_random_peasant
remove_character_flag = peasant_faction_claimant_without_title
if = {
limit = {
has_character_flag = peasant_faction_random_peasant
NOT = { has_character_flag = peasant_revolt_do_not_kill }
}
death = {
death_reason = death_vanished
}
}
}
}
}
}
demand = {
setup_populist_leader_effect = yes
# Faction leader is unhappy if they reach the point of needing to issue an ultimatim.
faction_leader = {
add_opinion = {
modifier = angry_opinion
target = root.faction_target
opinion = -20
}
}
# Refresh the faction's target title (best target may have changed between creation and pressing demands).
get_popular_revolt_target_effect = { FACTION = this }
# Save scopes that will be used in the demand event.
save_scope_as = faction
special_character = {
save_scope_as = peasant_leader
}
special_title = {
save_scope_as = target_title
}
# Check for relevant vassals that owns any land targeted by the faction.
save_temporary_scope_as = county_faction
every_faction_county_member = {
limit = {
holder = {
this != scope:faction.faction_target
NOT = {
joined_faction ?= {
this = scope:county_faction
}
}
OR = {
is_vassal_of = scope:faction.faction_target
is_ai = no
}
NOT = { is_in_list = popular_faction_vassal_targets }
}
}
holder = {
add_to_list = popular_faction_vassal_targets
}
}
every_faction_county_member = {
holder = {
every_liege_or_above = {
limit = {
this != scope:faction.faction_target
NOT = {
joined_faction ?= {
this = scope:county_faction
}
}
OR = {
is_vassal_of = scope:faction.faction_target
is_ai = no
}
NOT = { is_in_list = popular_faction_vassal_targets }
}
add_to_list = popular_faction_vassal_targets
}
}
}
# Check if there is a player affected by the faction. AI rulers are blocked from accepting the faction demand if so.
if = {
limit = {
any_in_list = {
list = popular_faction_vassal_targets
is_ai = no
}
}
scope:faction = {
set_variable = {
name = faction_targets_player
value = yes
}
}
}
# Fire the demand event. A follow up event will be sent to affected vassals.
scope:faction.faction_target = {
trigger_event = faction_demand.1001
}
}
ai_demand_chance = {
base = 100
modifier = {
add = -1000
faction_target = {
involved_activity ?= {
has_activity_type = activity_coronation
activity_host = prev
}
}
}
}
on_war_start = {
# Duchy initialization so we can concentrate the rebels in just a few important counties instead of spreading them over the entire realm.
every_faction_county_member = {
duchy = {
add_to_list = areas_of_rebellion
}
}
# Check where in the duchy the rebellion troops should spawn, then spawn them.
every_in_list = {
list = areas_of_rebellion
save_temporary_scope_as = this_duchy
# Determine where in the duchy those troops should spawn.
ordered_in_de_jure_hierarchy = {
# Troops can only spawn in counties that belong to our faction!
limit = {
tier = tier_county
any_title_joined_faction = {
this = root
}
}
# Sort counties by how many levies they provide; rebels will spawn in the strongest county.
order_by = total_county_levies
title_province = {
save_temporary_scope_as = local_center_of_rebellion
}
}
# Spawn the faction troops in the designated location.
root.faction_leader = {
spawn_popular_revolt_troops = yes
}
# Give the populist leader a commander for each stack of troops.
create_character = {
template = new_commander_character
location = scope:local_center_of_rebellion
faith = root.faction_leader.faith
culture = root.faction_leader.culture
save_scope_as = new_populist_commander
gender_female_chance = {
if = {
limit = { root.faction_leader.culture = { has_cultural_parameter = martial_custom_male_only_combatant } }
add = 0
}
else_if = {
limit = { root.faction_leader.culture = { has_cultural_parameter = martial_custom_female_only_combatant } }
add = 100
}
else = {
add = 50
}
}
}
scope:new_populist_commander = {
set_employer = root.faction_leader
}
}
# Give the populist leader a small purse so they don't immediately go bankrupt with army maintenance.
every_faction_county_member = {
root.faction_leader = {
add_gold = 25
}
}
}
leader_leaves = {
# Should only trigger when the leader is captured in battle.
if = {
limit = {
special_character = {
is_alive = no
}
}
faction_war = {
end_war = defender
}
destroy_faction = yes
}
if = {
limit = {
NOT = { has_variable = peasant_destroying }
exists = faction_war
}
faction_war = {
end_war = defender
}
}
}
character_allow_create = no
special_character_title = "FACTIONS_WINDOW_LEADER"
inherit_membership = yes
multiple_targeting = yes
}
escalated_peasant_faction = {
casus_belli = populist_war
leaders_allowed_to_leave = no
player_can_join = yes
sort_order = 3
name = FACTION_ESCALATED_PEASANT_DYNAMIC_NAME
short_effect_desc = escalated_peasant_faction_short_effect_desc
is_shown = {
always = no
}
discontent_progress = {
base = 2
modifier = {
faction_target = { ep3_restored_rome_hard_mode_trigger = yes }
add = 10
desc = ep3_story_cycle_restoring_rome_faction_discontent
}
modifier = {
faction_target = { can_vassals_be_attacked = yes }
add = 2
desc = border_war_increased_peasant_discontent
}
modifier = {
faction_target = {
top_participant_group:dynastic_cycle ?= {
has_participant_group_parameter = dynastic_cycle_more_peasant_factions
}
}
add = 2
desc = instability_increased_peasant_discontent
}
}
power_threshold = 0 # Peasant Factions place their demand regardless of their Power
requires_county = yes
requires_character = yes
# Faction existence is valid
is_valid = {
trigger_if = {
limit = {
exists = special_character
}
special_character = {
is_alive = yes
}
}
}
###########
# Counties/characters are allowed to exist in the faction at all (will be kicked out if they fail these checks while already in it).
is_character_valid = {
has_valid_faction_members_trigger = yes
is_imprisoned = no
# Not forbidden from being in factions.
NOT = {
has_character_flag = joining_faction_block
}
}
is_county_valid = {
# Only in Dynastic Cycle
any_county_situation = {
situation_type = dynastic_cycle
}
# Counties can only be in a faction against the top liege in their realm (who is inherently independent).
scope:faction.faction_target = holder.top_liege
# Player capitals are blocked from joining populist factions (to avoid Game Overing a player due to a populist uprising against their liege, which as a vassal they can't really prevent or fight)
trigger_if = {
limit = {
holder = {
is_ai = no
}
}
this != holder.capital_county
}
title_province = {
NOR = {
has_holding_type = nomad_holding
has_holding_type = herder_holding
}
}
}
###########
# Counties/characters are allowed to create/join the faction (but will remain in faction if they fail these after joining).
can_character_join = {
custom_tooltip = {
text = can_join_escalated_peasant_faction_tt
OR = {
domicile ?= {
has_domicile_parameter = can_join_peasant_factions
}
has_trait = peasant_leader
}
}
}
can_county_join = {
OR = {
has_county_modifier = peasant_war_lost_county_modifier
holder = scope:faction.faction_target
}
}
can_character_create = {
OR = {
domicile ?= {
has_domicile_parameter = can_join_peasant_factions
}
has_trait = peasant_leader
}
}
can_character_become_leader = {
OR = {
domicile ?= {
has_domicile_parameter = can_join_peasant_factions
}
has_trait = peasant_leader
}
}
county_join_score = {
base = 0
compare_modifier = {
desc = "FACTION_REASON_COUNTY_OPINION"
value = county_opinion
multiplier = -1.0
}
# If a suitable Popular Faction exists, perfer to join it instead.
modifier = {
desc = "FACTION_REASON_PREFER_POPULIST_FACTION"
add = -100
scope:faction.faction_target = {
top_liege = {
any_targeting_faction = {
faction_type = populist_faction
any_faction_county_member = {
this.title_province.faith = root.title_province.faith
}
}
}
}
}
# Reduced weight for a character's own capital to join a revolt against them.
modifier = {
desc = "FACTION_REASON_CAPITAL_COUNTY"
add = -10
this.title_province = scope:faction.faction_target.capital_province
}
legalism_virtue_and_sin_modifier = {
TARGET = scope:faction.faction_target
SCORE_PER_TRAIT = 10 # Worth 10 opinion per virtue.
}
# Ruling Caste
modifier = {
desc = "FACTION_REASON_RULING_CASTE"
add = -25
culture != scope:faction.faction_target.culture
scope:faction.faction_target.culture = { has_cultural_parameter = peasant_and_populist_factions_less_common }
}
# Defiant Ambushers
modifier = {
add = 25
county_opinion < 0
culture != scope:faction.faction_target.culture
culture = { has_cultural_parameter = county_peasant_and_populist_factions_more_common }
}
# Difficulty Settings
modifier = { # Easy
desc = "FACTION_REASON_DIFFICULTY_EASY"
add = -50
has_game_rule = easy_difficulty
scope:faction.faction_target = {
is_ai = no
}
}
modifier = { # Very Easy
desc = "FACTION_REASON_DIFFICULTY_VERY_EASY"
add = -150
has_game_rule = very_easy_difficulty
scope:faction.faction_target = {
is_ai = no
}
}
modifier = { # Hard
desc = "FACTION_REASON_DIFFICULTY_HARD"
add = -50
has_game_rule = hard_difficulty
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = { # Very Hard
desc = "FACTION_REASON_DIFFICULTY_VERY_HARD"
add = -150
has_game_rule = very_hard_difficulty
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = { # Conquerors
desc = "NO_FRIVOLOUS_ACTIVITIES_REASON"
add = -85
scope:faction.faction_target = {
ai_should_get_conqueror_bonuses = yes
}
}
modifier = { # Conquerors
desc = "NO_FRIVOLOUS_ACTIVITIES_REASON"
add = -150
scope:faction.faction_target = {
ai_should_get_extreme_conqueror_bonuses = yes
}
}
# Realm Stability Settings
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 25
has_game_rule = lesser_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -50
has_game_rule = higher_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -100
has_game_rule = extreme_realm_stability
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_LESSER"
add = 25
has_game_rule = lesser_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_HIGHER"
add = -50
has_game_rule = higher_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
modifier = {
desc = "FACTION_REASON_GAME_RULE_REALM_STABILITY_EXTREME"
add = -100
has_game_rule = extreme_realm_stability_ai_only
scope:faction.faction_target = {
is_ai = yes
}
}
# Conquerors
modifier = {
add = -100
scope:faction.faction_target = { ai_should_get_conqueror_bonuses = yes }
}
modifier = {
add = -200
scope:faction.faction_target = { ai_should_get_extreme_conqueror_bonuses = yes }
}
# stay if at war with the target
modifier = {
desc = "FACTION_REASON_AT_WAR_WITH_TARGET"
add = 1000
exists = joined_faction
joined_faction = {
faction_is_at_war = yes
}
}
# TGP Dynastic Cycle in Instability phase
modifier = {
desc = "FACTION_REASON_DYNASTIC_CYCLE_INSTABILITY"
add = 25
county_opinion < 0
scope:faction.faction_target = {
top_participant_group:dynastic_cycle ?= {
has_participant_group_parameter = dynastic_cycle_more_peasant_factions
}
}
}
# Pure Land
modifier = {
desc = "FACTION_REASON_POPULIST_PEASANT_MORE_LIKELY"
add = 25
county_opinion < 0
faith != scope:faction.faction_target.faith
faith = {
has_doctrine_parameter = peasant_and_populist_factions_more_common
}
}
modifier = {
desc = "FACTION_REASON_ESCALATED_TO_LIEGE"
add = 100
has_county_modifier = peasant_war_lost_county_modifier
}
}
county_power = county_levies_to_raise
ai_create_score = {
base = -10000 #handled by scripted effect peasant_faction_demands_enforced in 00_faction_effects.txt
}
ai_join_score = {
base = 0
modifier = {
desc = "FACTION_REASON_ESCALATED_TO_LIEGE"
add = 100
has_variable = peasant_war_escalates
}
}
can_county_create = {
holder.top_liege = scope:target
scope:target = {
NAND = {
is_ai = yes
OR = {
has_trait = greatest_of_khans
has_character_modifier = the_great_khan_modifier
}
}
}
####
# BLOCKERS
####
# General Faction immunity
custom_description = {
text = character_is_immune_to_factions
subject = scope:target
NOT = { scope:target = { immune_to_factions_trigger = yes } }
}
title_province = {
NOR = {
has_holding_type = nomad_holding
has_holding_type = herder_holding
}
}
}
on_creation = {
}
on_destroy = {
set_variable = {
name = peasant_destroying
value = yes
}
if = {
limit = { exists = special_character }
special_character = {
if = {
limit = {
OR = {
has_character_flag = peasant_faction_claimant_without_title
has_character_flag = peasant_faction_random_peasant
}
has_variable = peasant_title
}
if = {
limit = {
has_variable = peasant_title
}
destroy_title = this.var:peasant_title
}
if = {
limit = { # To make sure we aren't in debt
gold > 0
}
remove_long_term_gold = gold # Zero out our wallet since the revolt is over and we're going back to being unlanded.
}
}
if = {
limit = {
is_alive = yes # To prevent dead people from being checked for variables
}
if = {
limit = {
has_variable = rebel_leader_peasants
}
remove_variable = rebel_leader_peasants
}
remove_variable = peasant_title
remove_character_flag = peasant_faction_random_peasant
remove_character_flag = peasant_faction_claimant_without_title
if = {
limit = {
has_character_flag = peasant_faction_random_peasant
NOT = { has_character_flag = peasant_revolt_do_not_kill }
}
death = {
death_reason = death_vanished
}
}
}
}
}
}
demand = {
setup_populist_leader_effect = yes
# Faction leader is unhappy if they reach the point of needing to issue an ultimatim.
faction_leader = {
add_opinion = {
modifier = angry_opinion
target = root.faction_target
opinion = -20
}
}
# Refresh the faction's target title (best target may have changed between creation and pressing demands).
get_popular_revolt_target_effect = { FACTION = this }
# Save scopes that will be used in the demand event.
save_scope_as = faction
if = {
limit = {
special_character.joined_faction ?= root
}
special_character = {
save_scope_as = peasant_leader
}
}
else = {
faction_leader = {
save_scope_as = peasant_leader
}
}
special_title = {
save_scope_as = target_title
}
# Check for relevant vassals that owns any land targeted by the faction.
save_temporary_scope_as = county_faction
every_faction_county_member = {
limit = {
holder = {
this != scope:faction.faction_target
NOT = {
joined_faction ?= {
this = scope:county_faction
}
}
OR = {
is_vassal_of = scope:faction.faction_target
is_ai = no
}
NOT = { is_in_list = popular_faction_vassal_targets }
}
}
holder = {
add_to_list = popular_faction_vassal_targets
}
}
every_faction_county_member = {
holder = {
every_liege_or_above = {
limit = {
this != scope:faction.faction_target
NOT = {
joined_faction ?= {
this = scope:county_faction
}
}
OR = {
is_vassal_of = scope:faction.faction_target
is_ai = no
}
NOT = { is_in_list = popular_faction_vassal_targets }
}
add_to_list = popular_faction_vassal_targets
}
}
}
# Check if there is a player affected by the faction. AI rulers are blocked from accepting the faction demand if so.
if = {
limit = {
any_in_list = {
list = popular_faction_vassal_targets
is_ai = no
}
}
scope:faction = {
set_variable = {
name = faction_targets_player
value = yes
}
}
}
# Fire the demand event. A follow up event will be sent to affected vassals.
scope:faction.faction_target = {
trigger_event = faction_demand.1001
}
}
ai_demand_chance = {
base = 100
modifier = {
add = -1000
faction_target = {
involved_activity ?= {
has_activity_type = activity_coronation
activity_host = prev
}
}
}
}
on_war_start = {
# Duchy initialization so we can concentrate the rebels in just a few important counties instead of spreading them over the entire realm.
every_faction_county_member = {
duchy = {
add_to_list = areas_of_rebellion
}
}
# Check where in the duchy the rebellion troops should spawn, then spawn them.
every_in_list = {
list = areas_of_rebellion
save_temporary_scope_as = this_duchy
# Determine where in the duchy those troops should spawn.
ordered_in_de_jure_hierarchy = {
# Troops can only spawn in counties that belong to our faction!
limit = {
tier = tier_county
any_title_joined_faction = {
this = root
}
}
# Sort counties by how many levies they provide; rebels will spawn in the strongest county.
order_by = total_county_levies
title_province = {
save_temporary_scope_as = local_center_of_rebellion
}
}
# Spawn the faction troops in the designated location.
root.faction_leader = {
spawn_popular_revolt_troops = yes
}
# Give the populist leader a commander for each stack of troops.
create_character = {
template = new_commander_character
location = scope:local_center_of_rebellion
faith = root.faction_leader.faith
culture = root.faction_leader.culture
save_scope_as = new_populist_commander
gender_female_chance = {
if = {
limit = { root.faction_leader.culture = { has_cultural_parameter = martial_custom_male_only_combatant } }
add = 0
}
else_if = {
limit = { root.faction_leader.culture = { has_cultural_parameter = martial_custom_female_only_combatant } }
add = 100
}
else = {
add = 50
}
}
}
scope:new_populist_commander = {
set_employer = root.faction_leader
}
}
# Give the populist leader a small purse so they don't immediately go bankrupt with army maintenance.
every_faction_county_member = {
root.faction_leader = {
add_gold = 25
}
}
faction_leader = {
spawn_army = {
name = peasant_leader_army_name
men_at_arms = {
type = pikemen_militia
stacks = {
value = root.faction_leader.location.county.county_levies_to_raise
divide = 100
multiply = {
value = "root.faction_leader.has_trait_xp(peasant_leader)"
multiply = 0.05
}
round = yes
min = 1
}
}
men_at_arms = {
type = torch_bearers
stacks = {
value = "root.faction_leader.has_trait_xp(peasant_leader)"
multiply = 0.1
round = yes
min = 1
}
}
war = root.faction_war
location = root.faction_leader.location
origin = root.faction_leader.location
inheritable = no
war_keep_on_attacker_victory = yes
}
}
every_faction_member = {
limit = {
NOT = { has_trait = peasant_leader }
}
add_trait = peasant_leader
add_trait_xp = {
trait = peasant_leader
value = peasant_leader_xp_value
}
set_variable = {
name = rebel_leader_peasants
value = root
}
}
}
leader_leaves = {
# Should only trigger when the leader is captured in battle.
if = {
limit = {
special_character = {
is_alive = no
}
}
faction_war = {
end_war = defender
}
destroy_faction = yes
}
if = {
limit = {
NOT = { has_variable = peasant_destroying }
exists = faction_war
}
faction_war = {
end_war = defender
}
}
}
character_allow_create = yes
special_character_title = "FACTIONS_WINDOW_LEADER"
inherit_membership = no
multiple_targeting = no
county_can_switch_to_other_faction = no
}