N3OW/common/character_interactions/00_war.txt
2025-02-19 22:32:34 +00:00

1980 lines
40 KiB
Text

declare_war_interaction = {
category = interaction_category_diplomacy
common_interaction = yes
special_interaction = declare_war_interaction
interface = declare_war
interface_priority = 70
popup_on_receive = yes
pause_on_receive = no # this is handled by the interface instead
desc = declare_war_desc
is_shown = {
NOT = {
scope:recipient = scope:actor
}
scope:recipient = {
is_playable_character = yes
}
scope:actor = {
NOT = {
is_at_war_with = scope:recipient
}
}
}
is_valid_showing_failures_only = {
scope:actor = {
NOT = { has_trait = incapable }
can_attack_in_hierarchy = scope:recipient
NOT = {
has_raised_armies = yes
}
has_any_display_cb_on = scope:recipient
NOT = {
is_allied_in_war = scope:recipient
}
custom_description = {
text = "is_not_bankrupt"
gold > 0
}
NOT = {
custom_description = {
text = "is_in_an_activity"
exists = involved_activity
}
}
trigger_if = {
limit = {
culture = { has_cultural_parameter = cannot_attack_allies }
}
NOT = {
is_allied_to = scope:recipient
}
}
trigger_if = {
limit = {
culture = { has_cultural_parameter = cannot_attack_truces }
}
NOT = {
has_truce = scope:recipient
}
}
is_imprisoned = no
trigger_if = {
limit = {
has_variable_list = subjugation_offer_under_consideration
}
custom_description = {
text = is_not_considering_offer_of_subjugation
NOT = {
is_target_in_variable_list = {
name = subjugation_offer_under_consideration
target = scope:recipient
}
}
}
}
}
scope:recipient = { NOT = { has_strong_hook = scope:actor } }
scope:recipient = {
trigger_if = {
limit = { is_imprisoned = yes }
NOT = {
imprisoner = scope:actor
}
}
}
scope:actor = {
trigger_if = {
limit = {
NOT = { government_allows = administrative }
liege ?= {
has_realm_law_flag = vassal_all_wars_banned_permanent
NOT = { this = scope:actor }
}
}
custom_tooltip = {
text = admin_all_vassal_wars_banned
always = no
}
}
trigger_if = {
limit = {
government_allows = administrative
top_liege = scope:recipient.top_liege
scope:recipient = { government_allows = administrative }
NOT = { top_liege = scope:recipient }
}
custom_tooltip = {
text = admin_cannot_declare_internal_wars
always = no
}
}
trigger_if = { # Admin - Laws only allow frontier and naval themes to declare war
limit = {
government_allows = administrative
is_independent_ruler = no
top_liege = {
this != scope:recipient.top_liege
has_realm_law_flag = admin_vassal_wars_restricted
}
}
custom_tooltip = {
text = admin_all_vassal_wars_banned
OR = {
vassal_contract_has_flag = admin_theme_frontier
vassal_contract_has_flag = admin_theme_naval
}
}
}
trigger_if = { # Admin - Laws only allow frontier and naval themes to declare war IF they have permission
limit = {
government_allows = administrative
OR = {
vassal_contract_has_flag = admin_theme_frontier
vassal_contract_has_flag = admin_theme_naval
}
top_liege = {
this != scope:recipient.top_liege
has_realm_law_flag = admin_vassal_wars_permission_only
NOT = { has_realm_law_flag = admin_vassal_wars_banned }
}
}
custom_tooltip = {
text = admin_vassal_wars_permission_only_desc
has_variable = admin_permission_to_declare_war
}
}
trigger_if = { # Admin - Laws prevent all vassals from declaring war
limit = {
government_allows = administrative
OR = {
vassal_contract_has_flag = admin_theme_frontier
vassal_contract_has_flag = admin_theme_naval
}
top_liege = {
this != scope:recipient.top_liege
has_realm_law_flag = admin_vassal_wars_banned
}
}
custom_tooltip = {
text = admin_all_vassal_wars_banned
always = no
}
}
}
scope:actor = {
trigger_if = {
limit = { is_landless_adventurer = yes }
custom_tooltip = {
text = camp_located_in_defender_realm.tt
domicile.domicile_location.county.holder = {
NOR = {
this = scope:recipient
any_liege_or_above = { this = scope:recipient }
}
}
}
}
}
}
has_valid_target_showing_failures_only = {
custom_description = {
text = "declare_war_hook_on_liege"
OR = {
war_declarer_needs_hook_on_liege = no
always = scope:hook
}
}
scope:actor = {
NOR = {
is_at_war_with = scope:recipient
custom_description = { #A vassal cannot go to war against someone their Liege is already at war with
text = liege_is_at_war_with_recipient
object = scope:recipient
liege = {
is_at_war_with = scope:recipient
}
}
}
}
}
send_options_exclusive = no
send_option = {
is_shown = {
war_declarer_needs_hook_on_liege = yes
}
is_valid = {
scope:actor = {
has_usable_hook = liege
}
}
flag = hook
localization = WAR_LIEGE_HOOK
can_invalidate_interaction = yes
}
should_use_extra_icon = {
war_declarer_needs_hook_on_liege = yes
scope:actor = { has_usable_hook = liege }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
on_accept = {
scope:actor = {
#Feedback!
hidden_effect = {
send_interface_toast = {
type = event_toast_effect_neutral
title = declare_war_interaction_notification
left_icon = scope:actor
right_icon = scope:recipient
custom_tooltip = declare_war_interaction_notification_tooltip
show_as_tooltip = {
if = {
limit = { always = scope:hook }
use_hook = liege
}
}
}
}
#Has the instigator promised a vassal a war (vassal.2601)?
if = {
limit = {
exists = var:promised_war
var:promised_war = {
is_alive = yes
NOT = { this = scope:recipient }
}
}
trigger_event = {
id = vassal.2610
days = { 7 10 }
}
}
if = {
limit = { always = scope:hook }
use_hook = liege
}
#Send break up event if they are your lover
if = {
limit = {
has_relation_lover = scope:recipient
NOT = { has_relation_rival = scope:recipient } #To enable really strange love stories
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
primary_defender = scope:recipient
any_target_title = { count >= 1 }
}
}
}
scope:recipient = {
trigger_event = {
id = lover.0103
days = { 14 30 }
}
}
}
#Invalidate any wars your vassals have going against recipient atm
scope:recipient = {
if = {
limit = {
any_character_war = {
primary_attacker = {
is_vassal_or_below_of = scope:actor
trigger_if = { #Ai should never invalidate a player's war!
limit = {
this = { is_ai = no }
}
scope:actor = {
is_ai = no
}
}
}
}
}
every_character_war = {
limit = {
primary_attacker = {
is_vassal_or_below_of = scope:actor
trigger_if = { #Ai should never invalidate a player's war!
limit = {
this = { is_ai = no }
}
scope:actor = {
is_ai = no
}
}
}
}
show_as_tooltip = { end_war = invalidated } #Actually ended in the event
primary_attacker = { trigger_event = war_event.1001 }
}
}
}
#Notify defender's vassals if the war is targeting one or more of their titles
scope:recipient = {
if = {
limit = {
any_vassal = {
save_temporary_scope_as = attacked_vassal
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
primary_defender = scope:recipient
any_target_title = {
holder = {
OR = {
this = scope:attacked_vassal
is_vassal_or_below_of = scope:attacked_vassal
}
}
}
}
}
}
}
every_vassal = {
save_temporary_scope_as = attacked_vassal
limit = {
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
primary_defender = scope:recipient
any_target_title = {
holder = {
OR = {
this = scope:attacked_vassal
is_vassal_or_below_of = scope:attacked_vassal
}
}
}
}
}
}
send_interface_toast = {
type = msg_war_declared_on_liege
title = declare_war_interaction_notification
left_icon = scope:actor
right_icon = scope:recipient
custom_tooltip = declare_war_interaction_notification_tooltip
}
}
}
}
# If you are admin and had permission to start war, spend said permission
if = {
limit = {
has_variable = admin_permission_to_declare_war
}
remove_variable = admin_permission_to_declare_war
}
}
}
auto_accept = yes
}
end_war_attacker_victory_interaction = {
special_interaction = end_war_attacker_victory_interaction
hidden = yes
use_diplomatic_range = no
secondary_scopes_optional = yes
ai_targets = {
ai_recipients = primary_war_enemies
}
ai_frequency = 1
# Depending on who was the attacker, we need to send a different notification message to the recipient.
notification_text = {
first_valid = {
triggered_desc = {
trigger = {
scope:recipient = {
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
}
}
}
}
desc = end_war_attacker_victory_attacker_desc
}
desc = end_war_attacker_victory_defender_desc
}
}
populate_actor_list = {
scope:actor = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor }
}
add_to_list = characters
}
}
}
populate_recipient_list = {
scope:recipient = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient }
}
add_to_list = characters
}
}
}
can_be_picked = {
scope:war ?= {
custom_tooltip = {
text = hostage_exchange_invalid_for_crusade_tt
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
}
custom_tooltip = {
text = hostage_exchange_invalid_for_cb_tt
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
}
redirect = {
# secondary recipient is always set, so we need to clear it
# if can_send condition depends on the scope being empty
clear_saved_scope = secondary_recipient
}
on_accept = {
casus_belli = {
primary_attacker = {
save_scope_as = attacker_winner
}
primary_defender = {
save_scope_as = defender_loser
}
}
if = {
limit = {
scope:war ?= {
using_cb = fp3_free_house_member_cb
}
}
}
else = {
release_prisoners_of_war_effect = yes
}
# Hostages
# Save scopes for clarity
if = {
limit = {
scope:war ?= {
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
if = {
limit = {
exists = scope:secondary_actor
scope:recipient = { is_landed_or_landless_administrative = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_actor
WARDEN = scope:recipient
HOME_COURT = scope:actor
}
}
if = {
limit = {
exists = scope:secondary_recipient
scope:actor = { is_landed_or_landless_administrative = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_recipient
WARDEN = scope:actor
HOME_COURT = scope:recipient
}
}
}
#Send notification to vassals
hidden_effect = {
scope:attacker_winner = {
if = {
limit = {
any_vassal = {
NOT = { this = scope:defender_loser }
}
}
every_vassal = {
limit = { NOT = { this = scope:defender_loser } }
send_interface_toast = {
type = msg_liege_war_ended_attacker_win
title = war_event.notification_liege_win.t
left_icon = scope:attacker_winner
right_icon = scope:defender_loser
custom_tooltip = war_event.1901
}
}
}
}
scope:defender_loser = {
if = {
limit = {
any_vassal = { NOT = { this = scope:attacker_winner } }
}
every_vassal = {
limit = {
NOT = { this = scope:attacker_winner }
}
send_interface_toast = {
type = msg_liege_war_ended_attacker_win
title = war_event.notification_liege_loss.t
left_icon = scope:defender_loser
right_icon = scope:attacker_winner
custom_tooltip = war_event.1902
}
}
}
}
}
#Special bookmark event for Aella of Northumbria
bookmark_867_northmen_aellas_capture_war_imprisonment_effect = yes
end_war = attacker
}
on_decline = {
}
ai_potential = {
is_at_war = yes
any_character_war = {
is_war_leader = root
OR = {
attacker_war_score >= 100
AND = {
attacker_war_score >= 90
root = {
has_perk = peacemaker_perk
}
primary_defender = {
is_ai = yes
}
}
primary_defender = {
is_ai = yes
ai_has_conqueror_personality = yes
}
}
}
}
ai_will_do = {
base = 0
modifier = {
scope:war = {
primary_attacker = scope:actor
OR = {
attacker_war_score >= 100
AND = {
attacker_war_score >= 90
scope:actor = {
has_perk = peacemaker_perk
}
primary_defender = {
is_ai = yes
}
}
AND = {
NOR = {
using_cb = undirected_great_holy_war
using_cb = mongol_invasion_war
using_cb = mongol_realm_invasion_war
}
primary_defender = {
is_ai = yes
ai_has_conqueror_personality = yes
}
}
}
}
add = 100
}
modifier = {
scope:war = {
primary_defender = scope:actor
attacker_war_score >= 100
days_since_max_war_score >= 180
}
add = 100
}
}
ai_accept = {
base = -99
compare_modifier = {
target = scope:war
value = attacker_war_score
desc = "WARSCORE_MODIFIER"
}
modifier = {
scope:war.casus_belli = {
primary_attacker = {
has_perk = peacemaker_perk
NOT = { this = scope:recipient }
}
}
add = peacemaker_value
desc = "PEACEMAKER_PERK_MODIFIER"
}
# Hostages
modifier = {
exists = scope:secondary_actor
add = war_actor_hostage_value
desc = WAR_OVERVIEW_HOSTAGE_OFFER_VALUE
}
modifier = {
exists = scope:secondary_recipient
add = war_recipient_hostage_value
desc = WAR_OVERVIEW_HOSTAGE_DEMAND_VALUE
}
# The AI cannot accept the outcome, if they will lose all their land and you try to take a hostage from them
modifier = {
scope:war = {
OR = {
exists = scope:secondary_actor
exists = scope:secondary_recipient
}
casus_belli = {
any_target_title = {
count >= 1
add_to_temporary_list = target_titles
}
}
NOT = {
scope:recipient = {
any_held_title = {
tier = tier_county
NOT = {
any_this_title_or_de_jure_above = { is_in_list = target_titles }
}
}
}
}
}
add = -10000
desc = WAR_OVERVIEW_HOSTAGE_DEMAND_BLOCKED
}
# This is a bit of a hidden modifier, only used to make sure we get the right icon when you force it through at 100 war score, and the opponent has more realm left
modifier = {
scope:war = {
attacker_war_score >= 100
OR = {
exists = scope:secondary_actor
exists = scope:secondary_recipient
}
casus_belli = {
any_target_title = {
count >= 1
add_to_temporary_list = target_titles
}
}
scope:recipient = {
any_held_title = {
tier = tier_county
NOT = {
any_this_title_or_de_jure_above = { is_in_list = target_titles }
}
}
}
}
add = 1000
desc = "WARSCORE_MODIFIER"
}
}
auto_accept = {
trigger_if = {
limit = {
OR = {
scope:war = {
attacker_war_score >= 100
}
AND = {
scope:recipient = { is_ai = yes }
primary_attacker = scope:recipient
}
scope:war.casus_belli = { # Conquerors know when to fold
primary_attacker = {
is_ai = yes
current_military_strength >= scope:recipient.fifty_percent_more_of_current_military_strength
}
primary_defender = {
is_ai = yes
ai_has_conqueror_personality = yes
this = scope:recipient
}
}
}
}
always = yes
}
trigger_else = {
always = no
}
# The auto accept kind of messes up the hostage interaction a bit, so we block the auto accept if they try to grab a hostage and all the opponent's land at the same time
scope:war = {
trigger_if = {
limit = {
OR = {
exists = scope:secondary_actor
exists = scope:secondary_recipient
}
casus_belli = {
any_target_title = {
count >= 1
add_to_temporary_list = target_titles
}
}
NOT = {
scope:recipient = {
any_held_title = {
tier = tier_county
NOT = {
any_this_title_or_de_jure_above = { is_in_list = target_titles }
}
}
}
}
}
always = no
}
}
}
is_valid_showing_failures_only = {
scope:war = {
has_valid_casus_belli = yes
trigger_if = { # Cannot exchange hostages with soon to be landless
limit = {
OR = {
exists = scope:secondary_actor
exists = scope:secondary_recipient
}
casus_belli = {
any_target_title = {
count >= 1
add_to_temporary_list = target_titles
}
}
}
custom_tooltip = {
text = hostage_no_land_after_war_tt
scope:recipient = {
any_held_title = {
tier = tier_county
NOT = {
any_this_title_or_de_jure_above = { is_in_list = target_titles }
}
}
}
}
}
}
}
}
end_war_attacker_white_peace_interaction = {
special_interaction = end_war_white_peace_interaction
hidden = yes
use_diplomatic_range = no
secondary_scopes_optional = yes
send_name = "WHITE_PEACE_INTERACTION"
ai_targets = {
ai_recipients = primary_war_enemies
}
ai_frequency = 12
# Depending on who was the attacker, we need to send a different notification message to the recipient.
notification_text = {
first_valid = {
triggered_desc = {
trigger = {
scope:recipient = {
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
}
}
}
}
desc = end_war_attacker_white_peace_attacker_desc
}
desc = end_war_attacker_white_peace_defender_desc
}
}
redirect = {
# secondary recipient is always set, so we need to clear it
# if can_send condition depends on the scope being empty
clear_saved_scope = secondary_recipient
}
populate_actor_list = {
scope:actor = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor }
}
add_to_list = characters
}
}
}
populate_recipient_list = {
scope:recipient = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient }
}
add_to_list = characters
}
}
}
can_be_picked = {
scope:war ?= {
custom_tooltip = {
text = hostage_exchange_invalid_for_crusade_tt
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
}
custom_tooltip = {
text = hostage_exchange_invalid_for_cb_tt
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
}
on_accept = {
casus_belli = {
primary_attacker = {
save_scope_as = attacker_white_peace
}
primary_defender = {
save_scope_as = defender_white_peace
}
}
if = {
limit = {
scope:war ?= {
using_cb = fp3_free_house_member_cb
}
}
}
else = {
release_prisoners_of_war_effect = yes
}
# Hostages
# Save scopes for clarity
if = {
limit = {
scope:war ?= {
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
if = {
limit = {
exists = scope:secondary_actor
scope:recipient = { is_landed_or_landless_administrative = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_actor
WARDEN = scope:recipient
HOME_COURT = scope:actor
}
}
if = {
limit = {
exists = scope:secondary_recipient
scope:actor = { is_landed_or_landless_administrative = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_recipient
WARDEN = scope:actor
HOME_COURT = scope:recipient
}
}
}
#Send notification to vassals
hidden_effect = {
scope:attacker_white_peace = {
if = {
limit = {
any_vassal = { NOT = { this = scope:defender_white_peace } }
}
every_vassal = {
limit = {
NOT = { this = scope:defender_white_peace }
}
send_interface_toast = {
type = msg_liege_war_ended_white_peace
title = WAR_RESULTS_WHITE_PEACE
left_icon = scope:attacker_white_peace
right_icon = scope:defender_white_peace
custom_tooltip = war_event.1903
}
}
}
}
scope:defender_white_peace = {
if = {
limit = {
any_vassal = { NOT = { this = scope:attacker_white_peace } }
}
every_vassal = {
limit = {
NOT = { this = scope:attacker_white_peace }
}
send_interface_toast = {
type = msg_liege_war_ended_white_peace
title = WAR_RESULTS_WHITE_PEACE
left_icon = scope:defender_white_peace
right_icon = scope:attacker_white_peace
custom_tooltip = war_event.1904
}
}
}
}
}
end_war = white_peace
}
on_decline = {
}
ai_potential = {
any_character_war = {
count >= 1
casus_belli = {
OR = {
primary_attacker = root
primary_defender = root
}
}
}
trigger_if = {
limit = {
exists = scope:war
}
NOR = { # Don't send inane white peace offers to the player
scope:war = {
casus_belli = {
primary_defender = root
primary_attacker = {
is_ai = no
}
}
attacker_war_score >= 10
}
scope:war = {
casus_belli = {
primary_attacker = root
primary_defender = {
is_ai = no
}
}
defender_war_score >= 70
}
}
}
}
ai_will_do = {
base = 0
# Attacker concerned about defending in other wars
modifier = {
scope:war.casus_belli = {
primary_attacker = root
}
scope:war = {
war_days >= 365
attacker_war_score <= 0
}
any_character_war = {
NOT = { this = scope:war }
casus_belli = {
primary_defender = root
}
}
add = {
value = 10
if = {
limit = {
scope:war = {
attacker_war_score <= -50
}
}
add = 40
}
}
}
# Attacker Greed
ai_value_modifier = {
ai_greed = {
if = {
limit = {
scope:war.casus_belli = {
primary_attacker = root
}
scope:war = {
war_days >= 365
attacker_war_score <= 10
}
ai_greed > -20
}
value = -0.25
}
}
ai_vengefulness = {
if = {
limit = { ai_vengefulness > 0 }
value = -1
}
}
}
# Defender prefers White Peace to loss
modifier = {
scope:war.casus_belli = {
primary_defender = root
}
scope:war = {
war_days >= 182
defender_war_score <= 15
}
add = {
value = 10
if = {
limit = {
scope:war = {
defender_war_score <= -40
}
}
add = 50
}
}
}
# Defenders want to end wars that's taking too long to win
modifier = {
scope:war.casus_belli = {
primary_defender = root
}
scope:war = {
war_days >= 365
}
add = {
value = scope:war.war_days
divide = 30
if = {
limit = {
scope:war = {
defender_war_score > 0
}
}
subtract = scope:war.defender_war_score
}
if = { # If you're this close, perhaps it's worth waiting a few more months for ticking warscore?
limit = {
scope:war = {
defender_war_score >= 70
}
}
subtract = scope:war.defender_war_score
}
min = 0
}
}
# I'm in debt, how about a white peace? Defender
modifier = {
scope:war = {
war_days >= 182
}
scope:war.casus_belli = {
primary_defender = root
}
debt_level >= 1
add = {
value = debt_level
multiply = 20
if = {
limit = { scope:war = { defender_war_score > 0 }}
subtract = scope:war.defender_war_score
}
if = { # Push through to the end, it's worth it at this point...
limit = { scope:war = { defender_war_score >= 80 }}
subtract = scope:war.defender_war_score
}
min = 0
}
}
# I'm in debt, how about a white peace? Attacker
modifier = {
scope:war = {
war_days >= 182
}
scope:war.casus_belli = {
primary_attacker = root
}
debt_level >= 1
add = {
value = debt_level
multiply = 20
if = {
limit = { scope:war = { attacker_war_score > 0 }}
subtract = scope:war.attacker_war_score
}
min = 0
}
}
# Do not attempt white peace vs. players if you're losing
modifier = {
OR = {
AND = {
scope:war.casus_belli = {
primary_attacker = root
primary_defender = { is_ai = no }
}
scope:war = {
defender_war_score >= 30
}
}
AND = {
scope:war.casus_belli = {
primary_defender = root
primary_attacker = { is_ai = no }
}
scope:war = {
attacker_war_score >= 30
}
}
}
factor = 0
}
# Can end with hostages of equalish value
modifier = {
exists = scope:secondary_recipient
exists = scope:secondary_actor
scope:war = {
war_days >= 365
NOR = {
defender_war_score >= 30
attacker_war_score >= 30
}
}
trigger_if = {
limit = { scope:war.primary_attacker = scope:actor }
interaction_relative_hostage_value > -10
}
trigger_else = { interaction_relative_hostage_value > -20 }
add = {
value = 0
if = {
limit = { interaction_relative_hostage_value < 0 }
add = {
value = interaction_relative_hostage_value
multiply = -1
}
}
else = { add = interaction_relative_hostage_value }
if = {
limit = { scope:actor.ai_boldness < 0 }
add = {
value = scope:actor.ai_boldness
multiply = -0.25
}
}
if = {
limit = { scope:actor.ai_honor < 0 }
add = {
value = scope:actor.ai_honor
multiply = 0.1
}
}
else = {
add = {
value = scope:actor.ai_honor
multiply = 0.25
}
}
if = {
limit = { scope:actor.ai_rationality < 0 }
add = {
value = scope:actor.ai_rationality
multiply = 0.1
}
}
else = {
add = {
value = scope:actor.ai_rationality
multiply = 0.25
}
}
if = {
limit = { scope:actor.ai_greed > 0 }
add = {
value = scope:actor.ai_greed
multiply = -0.1
}
}
else = {
add = {
value = scope:actor.ai_greed
multiply = -0.25
}
}
}
}
# Can end with hostage demand
modifier = {
exists = scope:secondary_recipient
NOT = { exists = scope:secondary_actor }
scope:war = {
war_days >= 365
NOR = {
defender_war_score >= 30
attacker_war_score >= 30
}
}
add = {
value = 0
add = {
value = interaction_recipient_hostage_value
multiply = 0.1
}
if = {
limit = { scope:actor.ai_boldness < 0 }
add = {
value = scope:actor.ai_boldness
multiply = -0.25
}
}
if = {
limit = { scope:actor.ai_honor < 0 }
add = {
value = scope:actor.ai_honor
multiply = -0.25
}
}
else = {
add = {
value = scope:actor.ai_honor
multiply = 0.25
}
}
if = {
limit = { scope:actor.ai_rationality < 0 }
add = {
value = scope:actor.ai_rationality
multiply = 0.25
}
}
else = {
add = {
value = scope:actor.ai_rationality
multiply = 0.25
}
}
if = {
limit = { scope:actor.ai_greed > 0 }
add = {
value = scope:actor.ai_greed
multiply = 0.25
}
}
else = {
add = {
value = scope:actor.ai_greed
multiply = -0.1
}
}
}
}
# I don't have time for this, I need to conquer
modifier = {
scope:war.casus_belli = {
primary_defender = {
this = scope:actor
ai_has_conqueror_personality = yes
}
primary_attacker = { is_ai = yes }
}
add = 100
}
}
ai_accept = {
base = -30
compare_modifier = {
trigger = {
scope:war.casus_belli = {
primary_defender = scope:recipient
}
}
target = scope:war
value = attacker_war_score
desc = "WARSCORE_MODIFIER"
}
compare_modifier = {
trigger = {
scope:war.casus_belli = {
primary_attacker = scope:recipient
}
}
target = scope:war
value = defender_war_score
desc = "WARSCORE_MODIFIER"
}
# Length of War
compare_modifier = {
target = scope:war
trigger = {
scope:war = {
war_days >= 365
}
}
value = {
value = war_days
divide = 91 # 40 in 10 years
}
desc = "WAR_LENGTH"
}
# I'm in debt, how about a white peace?
modifier = {
scope:war = {
war_days >= 182
}
scope:war.casus_belli = {
primary_defender = root
}
debt_level >= 1
add = {
value = debt_level
multiply = 20
}
desc = COMPLETELY_BANKRUPT
}
# Attacker concerned about other wars
modifier = {
scope:war.casus_belli = {
primary_attacker = scope:recipient
}
scope:recipient = {
any_character_war = {
NOT = { this = scope:war }
primary_defender = scope:recipient
}
}
add = 10
desc = CONCERN_ABOUT_OTHER_WARS
}
# Vengefulness
ai_value_modifier = {
trigger = {
scope:war.casus_belli = {
primary_defender = scope:recipient
}
}
ai_vengefulness = {
if = {
limit = {
scope:war.casus_belli = {
primary_defender = scope:recipient
}
}
value = -0.25
}
}
ai_greed = {
if = {
limit = {
scope:war.casus_belli = {
primary_attacker = scope:recipient
}
}
value = -0.25
}
}
ai_zeal = {
value = -0.2
if = {
limit = {
faith = {
faith_hostility_level = {
target = scope:actor.faith
value = 2
}
}
}
multiply = 2
}
if = {
limit = {
faith = {
faith_hostility_level = {
target = scope:actor.faith
value = 3
}
}
}
multiply = 3
}
if = {
limit = {
OR = {
ai_zeal <= 0
faith = {
faith_hostility_level = {
target = scope:actor.faith
value <= 0
}
}
}
}
value = 0
}
}
}
# Peacemaker Perk
modifier = {
trigger = {
scope:war.casus_belli = {
primary_defender = scope:recipient
primary_attacker = { has_perk = peacemaker_perk }
}
}
add = peacemaker_value
desc = "PEACEMAKER_PERK_MODIFIER"
}
modifier = {
trigger = {
scope:war.casus_belli = {
primary_attacker = scope:recipient
primary_defender = { has_perk = peacemaker_perk }
}
}
add = peacemaker_value
desc = "PEACEMAKER_PERK_MODIFIER"
}
# Cultural Traditions
modifier = {
trigger = {
scope:war.casus_belli = {
primary_defender = scope:recipient
primary_attacker = { culture = { has_cultural_parameter = facilitate_white_peace } }
}
}
add = 10
desc = "TRADITION_BONUS_WHITE_PEACE"
}
modifier = {
trigger = {
scope:war.casus_belli = {
primary_attacker = scope:recipient
primary_defender = { culture = { has_cultural_parameter = facilitate_white_peace } }
}
}
add = 10
desc = "TRADITION_BONUS_WHITE_PEACE"
}
# Struggles
modifier = {
trigger = {
scope:actor = {
OR = {
any_character_struggle = {
involvement = involved
is_struggle_parameter_active_secondary_character_involvement_either_trigger = {
PARAMETER = white_peace_acceptance_between_involved_or_interloper_with_region_easier
CHAR = scope:recipient
}
}
any_character_struggle = {
involvement = interloper
is_struggle_parameter_active_secondary_character_involvement_either_trigger = {
PARAMETER = white_peace_acceptance_between_involved_or_interloper_with_region_easier
CHAR = scope:recipient
}
}
}
}
}
add = 10
desc = "STRUGGLE_INVOLVED_OR_INTERLOPER_PHASE_BONUS"
}
# Hostages
modifier = {
exists = scope:secondary_actor
add = {
value = war_actor_hostage_value
multiply = 0.5
}
desc = WAR_OVERVIEW_WHITE_PEACE_HOSTAGE_OFFER_VALUE
}
modifier = {
exists = scope:secondary_recipient
add = {
value = war_recipient_hostage_value
multiply = 0.5
}
desc = WAR_OVERVIEW_WHITE_PEACE_HOSTAGE_DEMAND_VALUE
}
}
is_valid_showing_failures_only = {
exists = scope:war
scope:war = {
has_valid_casus_belli = yes
}
is_white_peace_possible = yes
}
}
end_war_attacker_defeat_interaction = {
special_interaction = end_war_attacker_defeat_interaction
hidden = yes
use_diplomatic_range = no
secondary_scopes_optional = yes
ai_targets = {
ai_recipients = primary_war_enemies
}
ai_frequency = 1
# Depending on who was the attacker, we need to send a different notification message to the recipient.
notification_text = {
first_valid = {
triggered_desc = {
trigger = {
scope:recipient = {
any_character_war = {
casus_belli = {
primary_attacker = scope:actor
}
}
}
}
desc = end_war_attacker_defeat_attacker_desc
}
desc = end_war_attacker_defeat_defender_desc
}
}
populate_actor_list = {
scope:actor = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:actor }
}
add_to_list = characters
}
}
}
populate_recipient_list = {
scope:recipient = {
every_close_family_member = {
limit = {
# Unlanded, at sender's court, child/sibling/nibling/grandchild
bp2_valid_to_offer_as_hostage_trigger = { SENDER = scope:recipient }
}
add_to_list = characters
}
}
}
can_be_picked = {
scope:war ?= {
custom_tooltip = {
text = hostage_exchange_invalid_for_crusade_tt
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
}
custom_tooltip = {
text = hostage_exchange_invalid_for_cb_tt
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
}
redirect = {
# secondary recipient is always set, so we need to clear it
# if can_send condition depends on the scope being empty
clear_saved_scope = secondary_recipient
}
on_accept = {
casus_belli = {
primary_attacker = {
save_scope_as = attacker_loser
}
primary_defender = {
save_scope_as = defender_winner
set_signature_weapon_effect = yes
}
}
if = {
limit = {
scope:war ?= {
using_cb = fp3_free_house_member_cb
}
}
}
else = {
release_prisoners_of_war_effect = yes
}
# Hostages
# Save scopes for clarity
if = {
limit = {
scope:war ?= {
NOR = {
using_cb = undirected_great_holy_war
using_cb = directed_great_holy_war
}
bp2_hostage_exchange_invalid_cb_trigger = no
}
}
if = {
limit = {
exists = scope:secondary_actor
scope:recipient = { is_landed = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_actor
WARDEN = scope:recipient
HOME_COURT = scope:actor
}
}
if = {
limit = {
exists = scope:secondary_recipient
scope:actor = { is_landed = yes }
}
hostage_depart_effect = {
HOSTAGE = scope:secondary_recipient
WARDEN = scope:actor
HOME_COURT = scope:recipient
}
}
}
#Send notification to vassals
hidden_effect = {
scope:attacker_loser = {
if = {
limit = {
any_vassal = {
NOT = { this = scope:defender_winner }
}
}
every_vassal = {
limit = {
NOT = { this = scope:defender_winner }
}
send_interface_toast = {
type = msg_liege_war_ended_defender_win
title = war_event.notification_liege_loss.t
left_icon = scope:attacker_loser
right_icon = scope:defender_winner
custom_tooltip = war_event.1905
}
}
}
}
scope:defender_winner = {
if = {
limit = {
any_vassal = { NOT = { this = scope:attacker_loser } }
}
every_vassal = {
limit = {
NOT = { this = scope:attacker_loser }
}
send_interface_toast = {
type = msg_liege_war_ended_defender_win
title = war_event.notification_liege_win.t
left_icon = scope:defender_winner
right_icon = scope:attacker_loser
custom_tooltip = war_event.1906
}
}
}
}
}
end_war = defender
}
on_decline = {
}
ai_potential = {
is_at_war = yes
any_character_war = {
is_war_leader = root
OR = {
defender_war_score >= 100
AND = {
defender_war_score >= 90
root = {
OR = {
has_perk = peacemaker_perk
culture = {
has_cultural_parameter = can_end_defensive_wars_earlier
}
}
}
primary_attacker = {
is_ai = yes
}
}
}
}
}
ai_will_do = {
base = 0
modifier = {
scope:war = {
primary_defender = scope:actor
OR = {
defender_war_score >= 100
AND = {
defender_war_score >= 90
scope:actor = {
OR = {
has_perk = peacemaker_perk
culture = {
has_cultural_parameter = can_end_defensive_wars_earlier
}
}
}
primary_attacker = {
is_ai = yes
}
}
}
}
add = 100
}
modifier = {
scope:war = {
primary_attacker = scope:actor
defender_war_score >= 100
days_since_max_war_score >= 180
}
add = 100
}
}
ai_accept = {
base = -99
compare_modifier = {
target = scope:war
value = defender_war_score
desc = "WARSCORE_MODIFIER"
}
modifier = {
add = 1000
scope:war.casus_belli = {
primary_defender = scope:recipient
}
desc = "WOULD_WIN_MODIFIER"
}
modifier = {
scope:war.casus_belli = {
primary_defender = {
has_perk = peacemaker_perk
NOT = { this = scope:recipient }
}
}
add = peacemaker_value
desc = "PEACEMAKER_PERK_MODIFIER"
}
modifier = {
scope:war.casus_belli = {
primary_defender = {
culture = {
has_cultural_parameter = can_end_defensive_wars_earlier
}
NOT = { this = scope:recipient }
}
}
add = 10
desc = "TRADITION_BONUS_DEFENSIVE_WARS"
}
# Hostages
modifier = {
exists = scope:secondary_actor
add = war_actor_hostage_value
desc = WAR_OVERVIEW_HOSTAGE_OFFER_VALUE
}
modifier = {
exists = scope:secondary_recipient
add = war_recipient_hostage_value
desc = WAR_OVERVIEW_HOSTAGE_DEMAND_VALUE
}
}
auto_accept = {
OR = {
scope:war = {
defender_war_score >= 100
}
AND = {
scope:recipient = { is_ai = yes }
primary_defender = scope:recipient
}
}
}
is_valid_showing_failures_only = {
scope:war = {
has_valid_casus_belli = yes
}
}
}
view_war_interaction = {
category = interaction_category_diplomacy
common_interaction = yes
special_interaction = offer_peace_interaction
interface = offer_peace
use_diplomatic_range = no
ignores_pending_interaction_block = yes
is_shown = {
scope:actor = {
is_at_war_with = scope:recipient
NOT = {
any_character_war = {
is_war_leader = scope:actor
is_participant = scope:recipient
}
}
}
}
auto_accept = yes
}
offer_peace_interaction = {
category = interaction_category_diplomacy
common_interaction = yes
icon = war_won_icon
special_interaction = offer_peace_interaction
interface = offer_peace
use_diplomatic_range = no
is_shown = {
scope:actor = {
is_at_war_with = scope:recipient
any_character_war = {
is_war_leader = scope:actor
is_participant = scope:recipient
}
}
}
auto_accept = yes
}