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

1033 lines
23 KiB
Text

# Character Interactions from FP1
##################
# Designate someone as your chief sacrifice at a blot.
# by Ewan Cowhig Croft
##################
designate_gruesome_festivals_sacrifice_interaction = {
icon = icon_scheme_abduct
interface_priority = 30
category = interaction_category_religion
desc = designate_gruesome_festivals_sacrifice_interaction_desc
is_shown = {
scope:actor = { has_character_flag = gruesome_festivals_can_pick_human_sacrifice }
scope:recipient = {
is_imprisoned_by = scope:actor
NOT = { has_character_modifier = gruesome_festivals_designated_sacrifice_fp1_modifier }
}
}
is_valid_showing_failures_only = {
}
on_accept = {
scope:actor = {
hidden_effect = {
every_prisoner = {
limit = { has_character_modifier = gruesome_festivals_designated_sacrifice_fp1_modifier }
save_scope_value_as = {
name = removal_type
value = flag:override
}
designate_gruesome_festivals_sacrifice_modifier_removed_effect = { DESIGNATOR = scope:actor }
}
}
}
scope:recipient = {
send_interface_toast = {
type = event_toast_effect_neutral
title = designate_gruesome_festivals_sacrifice_interaction.recipient.notification.t
left_icon = scope:actor
designate_gruesome_festivals_sacrifice_interaction_effect = yes
custom_tooltip = designate_gruesome_festivals_sacrifice_interaction.recipient.notification.tt
}
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_loss
DESC = clan_unity_human_sacrifice.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
auto_accept = yes
}
##################
# Give someone reprieve from being HumSac'd.
# by Ewan Cowhig Croft
##################
remove_designated_gruesome_festivals_sacrifice_interaction = {
icon = icon_scheme_abduct
interface_priority = 30
category = interaction_category_religion
desc = remove_designated_gruesome_festivals_sacrifice_interaction_desc
is_shown = {
scope:actor = { has_character_flag = gruesome_festivals_can_pick_human_sacrifice }
scope:recipient = { has_character_modifier = gruesome_festivals_designated_sacrifice_fp1_modifier }
}
is_valid_showing_failures_only = {
}
on_accept = {
scope:recipient = {
save_scope_value_as = {
name = removal_type
value = flag:manual
}
designate_gruesome_festivals_sacrifice_modifier_removed_effect ={ DESIGNATOR = scope:actor }
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_gain
DESC = clan_unity_human_sacrifice_removal.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
auto_accept = yes
}
##################
# Challenge a cur to combat for their crimes!
# by Ewan Cowhig Croft
##################
challenge_to_trial_by_combat_interaction = {
icon = icon_combat
interface_priority = 30
common_interaction = yes
category = interaction_category_hostile
popup_on_receive = yes
pause_on_receive = yes
desc = challenge_to_trial_by_combat_interaction_desc
highlighted_reason = challenge_to_trial_by_combat_interaction_HIGHLIGHTED
greeting = negative
notification_text = REQUEST_TRIAL_BY_COMBAT_TEXT
is_shown = {
# Early out on whether you have the DLC or not.
has_fp1_dlc_trigger = yes
# First, evaluate culture to trim down our potentials list.
can_have_trial_by_combat_trigger = yes
# And obviously never against yourself.
NOT = { scope:actor = scope:recipient }
# Then, look to see if scope:actor has good cause.
scope:actor = {
# Check there are no lieges involved.
NOR = {
# Must not be in a position to imprison scope:recipient standardly.
target_is_liege_or_above = scope:recipient
# Can't be used against anyone who has authority over you.
scope:recipient = { target_is_liege_or_above = scope:actor }
}
# Scope:recipient cannot be a landless character in scope:actor's sub-realm.
scope:recipient = {
is_landed_or_landless_administrative = yes
NAND = {
exists = court_owner
court_owner = {
OR = {
this = scope:actor
any_liege_or_above = { this = scope:actor }
}
}
}
}
}
}
is_highlighted = {
trial_by_combat_is_valid_trigger = yes
}
is_valid_showing_failures_only = {
trial_by_combat_is_valid_trigger = yes
}
can_send = {
scope:actor = {
custom_description = {
text = "character_interactions_hostile_actions_disabled_delay"
NOT = { has_character_flag = flag_hostile_actions_disabled_delay }
}
}
}
cooldown = { years = 5 }
cooldown_against_recipient = { years = 10 }
on_send = {
scope:actor = {
add_character_flag = {
flag = flag_hostile_actions_disabled_delay
days = 10
}
}
}
on_accept = {
# Will scope:recipient need to choose a champion?
if = {
limit = {
scope:recipient = {
OR = {
can_start_single_combat_eligibility_checks_trigger = no
NOT = {
can_be_combatant_based_on_gender_trigger = { ARMY_OWNER = scope:recipient }
}
}
}
}
scope:recipient = { trigger_event = fp1_tbc.0101 }
# Inform both characters that scope:recipient will have a chance to choose a champion.
custom_tooltip = fp1_tbc_recipient_will_designate_champion
}
# Else we skip straight to scope:actor's setup event.
else = {
# Stopping only briefly to clarify that scope:recipient will be fighting the bout themselves.
scope:recipient = { save_scope_as = champion }
scope:actor = { trigger_event = fp1_tbc.0001 }
}
# Inform of the consequences.
## Death - one of you will die.
if = {
limit = { always = scope:tbc_death }
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = fp1_tbc_winner_actor
fp1_tbc_death_effect = {
TBC_VICTOR = scope:actor
TBC_LOSER = scope:recipient
}
scope:actor = {
add_kinslayer_trait_or_nothing_effect = { VICTIM = scope:recipient }
}
}
50 = {
show_chance = no
desc = fp1_tbc_winner_recipient
fp1_tbc_death_effect = {
TBC_VICTOR = scope:recipient
TBC_LOSER = scope:actor
}
scope:recipient = {
add_kinslayer_trait_or_nothing_effect = { VICTIM = scope:actor }
}
}
}
}
}
## Gold - scope:recipient will have to pay gold, or scope:actor will take stress.
if = {
limit = { always = scope:tbc_gold }
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = fp1_tbc_winner_actor
fp1_tbc_gold_effect = {
TBC_VICTOR = scope:actor
TBC_LOSER = scope:recipient
}
}
50 = {
show_chance = no
desc = fp1_tbc_winner_recipient
fp1_tbc_actor_defeated_effect = { TBC_LOSER = scope:actor }
}
}
}
}
## Hook - scope:recipient will concede a hook, or scope:actor will take stress.
if = {
limit = { always = scope:tbc_weak_hook }
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = fp1_tbc_winner_actor
fp1_tbc_hook_effect = {
TBC_VICTOR = scope:actor
TBC_LOSER = scope:recipient
}
}
50 = {
show_chance = no
desc = fp1_tbc_winner_recipient
fp1_tbc_actor_defeated_effect = { TBC_LOSER = scope:actor }
}
}
}
}
## Humiliation - scope:recipient will gain an immense amount of stress, or scope:actor will take some stress.
if = {
limit = { always = scope:tbc_humiliation }
show_as_tooltip = {
random_list = {
50 = {
show_chance = no
desc = fp1_tbc_winner_actor
fp1_tbc_humiliation_effect = { TBC_LOSER = scope:recipient }
}
50 = {
show_chance = no
desc = fp1_tbc_winner_recipient
fp1_tbc_actor_defeated_effect = { TBC_LOSER = scope:actor }
}
}
}
}
# Clear up hostile actions flag.
if = {
limit = {
scope:actor = { has_character_flag = flag_hostile_actions_disabled_delay }
}
scope:actor = { remove_character_flag = flag_hostile_actions_disabled_delay }
}
# If we're a clan this interaction affects unity
add_clan_unity_interaction_effect = {
CHARACTER = scope:actor
TARGET = scope:recipient
VALUE = medium_unity_loss
DESC = clan_unity_trial_by_combat.desc
REVERSE_NON_HOUSE_TARGET = no
}
}
on_decline = {
# Scope:recipient loses some prestige.
scope:recipient = { add_prestige = medium_prestige_loss }
# Scope:actor decline processing.
scope:actor = {
# Inform them of the declination.
trigger_event = fp1_tbc.0031
# Cooldown is removed.
hidden_effect = { remove_interaction_cooldown = challenge_to_trial_by_combat_interaction }
# Clear up hostile actions flag.
if = {
limit = {
has_character_flag = flag_hostile_actions_disabled_delay
}
remove_character_flag = flag_hostile_actions_disabled_delay
}
}
}
# Demand it to the death.
send_option = {
# Only tribals fight to the death.
is_shown = {
scope:actor = { government_has_flag = government_is_tribal }
# And there's no real sense doing it if you can't fight your opponent directly.
scope:recipient = {
NOR = {
can_start_single_combat_eligibility_checks_trigger = no
NOT = {
can_be_combatant_based_on_gender_trigger = { ARMY_OWNER = scope:recipient }
}
}
}
}
flag = tbc_death
localization = "TBC_DEATH"
}
# Demand gold.
send_option = {
# Always available.
is_shown = { always = yes }
flag = tbc_gold
localization = "TBC_GOLD"
}
# Demand a hook.
send_option = {
# Must not have a better hook.
is_shown = {
NOT = {
scope:actor = { has_strong_hook = scope:recipient }
}
}
flag = tbc_weak_hook
localization = "TBC_WEAK_HOOK"
}
# Demand humiliation.
send_option = {
#Should not be used on children
is_shown = {
scope:recipient = { is_adult = yes }
}
flag = tbc_humiliation
localization = "TBC_HUMILIATION"
}
auto_accept = no
ai_accept = {
base = 0 # Try to make it 0 for most interactions
# Fightan abilities of both sides.
modifier = {
add = {
value = scope:actor.prowess
multiply = -0.5
}
desc = TBC_PROWESS_ACTOR
}
modifier = {
add = {
value = scope:recipient.prowess
multiply = 0.5
}
desc = TBC_PROWESS_RECIPIENT
}
# Who doesn't like punching a bastard?
opinion_modifier = {
who = scope:recipient
opinion_target = scope:actor
multiplier = -1
desc = AI_OPINION_REASON
}
# Weight up for personality values.
ai_value_modifier = {
who = scope:recipient
ai_boldness = {
if = {
limit = {
scope:recipient = {
NOT = { ai_boldness = 0 }
}
}
value = 0.5
}
}
ai_honor = {
if = {
limit = {
scope:recipient = {
NOT = { ai_honor = 0 }
}
}
value = 0.5
}
}
}
# Specific settlement preferences.
## Death: disliked by people who feel that disputes can always be settled more amicably.
### Craven hates.
modifier = {
add = -10
has_trait = craven
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_CRAVEN
}
### Forgiving hates.
modifier = {
add = -10
has_trait = forgiving
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_FORGIVING
}
### Compassionate dislikes.
modifier = {
add = -10
has_trait = compassionate
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_COMPASSIONATE
}
### Brave loves.
modifier = {
add = 20
has_trait = brave
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_BRAVE
}
### Vengeful loves.
modifier = {
add = 20
has_trait = vengeful
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_VENGEFUL
}
### Callous likes.
modifier = {
add = 10
has_trait = callous
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_CALLOUS
}
### Sadistic loves.
modifier = {
add = 20
has_trait = sadistic
scope:tbc_death = yes
desc = TBC_OPINION_DEATH_TRAIT_SADISTIC
}
## Gold: disliked by people who think wealth is sacrosanct.
### Greedy dislikes.
modifier = {
add = -10
has_trait = greedy
scope:tbc_gold = yes
desc = TBC_OPINION_GOLD_TRAIT_GREEDY
}
### Generous likes.
modifier = {
add = 10
has_trait = generous
scope:tbc_gold = yes
desc = TBC_OPINION_GOLD_TRAIT_GENEROUS
}
## Weak Hook: disliked by people who don't like nebulous favours or being indebted to their lessers.
### Arrogant dislikes.
modifier = {
add = -10
has_trait = arrogant
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_ARROGANT
}
### Paranoid dislikes.
modifier = {
add = -10
has_trait = paranoid
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_PARANOID
}
### Arbitray dislikes.
modifier = {
add = -10
has_trait = arbitrary
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_ARBITRARY
}
### Humble likes.
modifier = {
add = 10
has_trait = humble
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_HUMBLE
}
### Trusting likes.
modifier = {
add = 10
has_trait = trusting
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_TRUSTING
}
### Just likes.
modifier = {
add = 10
has_trait = just
scope:tbc_weak_hook = yes
desc = TBC_OPINION_WEAK_HOOK_TRAIT_JUST
}
## Humiliation: *hated* by people obsessed with public image or weightier consequences.
### Arrogant hates.
modifier = {
add = -20
has_trait = arrogant
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_ARROGANT
}
### Vengeful hates.
modifier = {
add = -20
has_trait = vengeful
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_VENGEFUL
}
### Stubborn hates.
modifier = {
add = -20
has_trait = stubborn
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_STUBBORN
}
### Humble likes.
modifier = {
add = 10
has_trait = humble
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_HUMBLE
}
### Forgiving likes.
modifier = {
add = 10
has_trait = forgiving
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_FORGIVING
}
### Fickle likes.
modifier = {
add = 10
has_trait = fickle
scope:tbc_humiliation = yes
desc = TBC_OPINION_HUMILIATION_TRAIT_FICKLE
}
# Apply tier differences.
## King -> Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value >= 4
}
}
add = 15
}
## Duke -> Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value = 3
}
}
add = 10
}
## Count -> Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value = 2
}
}
add = 5
}
## King <- Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value = -2
}
}
add = -10
}
## Duke <- Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value = -3
}
}
add = -20
}
## Count <- Baron.
modifier = {
desc = AI_REFUSAL_RANK_DIFFERENCE
scope:actor = {
tier_difference = {
target = scope:recipient
value <= -4
}
}
add = -30
}
# Rivalry modifier.
modifier = {
desc = offer_vassalization_interaction_aibehavior_rival_tt
trigger = {
scope:recipient = {
has_relation_rival = scope:actor
NOT = { has_relation_nemesis = scope:actor }
}
}
add = 50
}
# Nemesis modifier.
modifier = {
desc = offer_vassalization_interaction_aibehavior_nemesis_tt
trigger = {
scope:recipient = {
has_relation_nemesis = scope:actor
}
}
add = 100
}
}
# AI
ai_potential = {
basic_can_have_trial_by_combat_trigger = yes
NOT = {
has_trait = craven
}
is_imprisoned = no
can_start_single_combat_trigger = yes
}
ai_target_quick_trigger = {
adult = yes
}
ai_targets = {
ai_recipients = scripted_relations
}
ai_targets = {
ai_recipients = family
max = 10
}
ai_targets = {
ai_recipients = neighboring_rulers
ai_recipients = peer_vassals
chance = 0.25
}
ai_frequency = 36
ai_will_do = {
base = -50
# Factor for opinion.
modifier = {
add = 100
scope:actor = {
opinion = {
target = scope:recipient
value <= very_high_negative_opinion
}
}
}
modifier = {
add = 50
scope:actor = {
opinion = {
target = scope:recipient
value <= medium_negative_opinion
}
}
}
modifier = {
add = -50
scope:actor = {
opinion = {
target = scope:recipient
value >= medium_positive_opinion
}
}
}
modifier = {
add = -100
scope:actor = {
opinion = {
target = scope:recipient
value >= very_high_positive_opinion
}
}
}
# Don't challenge kinslayer-counting family, unless they're a rival or nemesis.
modifier = {
scope:actor = {
murdering_character_is_kinslaying_in_faith_trigger = {
CHARACTER = scope:recipient
FAITH = scope:actor.faith
}
}
scope:recipient = {
NOR = {
has_relation_rival = scope:actor
has_relation_nemesis = scope:actor
}
}
add = -1000
}
# Don't challenge your spouse, unless they're your rival or nemesis.
modifier = {
scope:recipient = {
is_spouse_of = scope:actor
NOR = {
has_relation_rival = scope:actor
has_relation_nemesis = scope:actor
}
}
add = -1000
}
# Don't challenge people hopelessly out of your league unless you're really, really not seeing things clearly.
modifier = {
scope:actor = {
prowess_diff = {
target = scope:recipient
value <= -15
}
ai_rationality >= high_negative_ai_value
}
add = -1000
}
}
}
##################
# Designate a Shieldmaiden
# by Alexander Oltner
##################
designate_shieldmaiden_interaction = {
icon = designate_shieldmaiden_interaction
category = interaction_category_friendly
common_interaction = yes
send_name = SEND_PROPOSAL
interface_priority = 120
ai_targets = {
ai_recipients = courtiers
}
ai_frequency = 180
is_shown = {
scope:actor = {
has_fp1_dlc_trigger = yes
is_physically_able_adult = yes
#Has access to the appropriate cultural parameter.
culture = { has_cultural_parameter = has_access_to_shieldmaidens }
trigger_if = { # Determined by Cultural Pillars
limit = { has_dlc_feature = diverge_culture }
culture = {
NOT = { has_cultural_parameter = martial_custom_equal_combatant }
}
}
trigger_else = {
NOT = {
faith = { has_doctrine = doctrine_gender_equal }
}
}
}
scope:recipient = {
NOT = { has_trait = incapable }
is_courtier_of = scope:actor
is_close_family_of = scope:actor
NOT = { has_trait = shieldmaiden }
trigger_if = { # Determined by Cultural Pillars
limit = { has_dlc_feature = diverge_culture }
OR = {
AND = {
is_female = yes
culture = { has_cultural_parameter = martial_custom_male_only_combatant }
}
AND = {
is_male = yes
culture = { has_cultural_parameter = martial_custom_female_only_combatant }
}
}
}
trigger_else = {
OR = { # Does not have the Royal Court and thus combatant is governed by faith
AND = {
is_female = yes
faith = { has_doctrine_parameter = combatant_must_be_male_if_no_roco }
}
AND = {
is_male = yes
faith = { has_doctrine_parameter = combatant_must_be_female_if_no_roco }
}
}
}
}
}
is_valid_showing_failures_only = {
scope:recipient = {
prowess >= decent_skill_rating
is_adult = yes
is_imprisoned = no
}
}
desc = designate_shieldmaiden_interaction_desc
on_accept = {
scope:actor = {
stress_impact = {
arrogant = medium_stress_impact_gain
paranoid = minor_stress_impact_gain
}
}
scope:recipient = {
add_trait = shieldmaiden
add_opinion = {
target = scope:actor
modifier = fp1_accepted_my_sword_opinion
}
}
if = {
limit = { always = scope:hook }
scope:actor = { use_hook = scope:recipient }
}
hidden_effect = {
scope:actor = {
send_interface_toast = {
type = event_toast_effect_neutral
title = designate_shieldmaiden_interaction_notification
left_icon = scope:actor
right_icon = scope:recipient
show_as_tooltip = {
scope:recipient = {
add_trait_force_tooltip = shieldmaiden
}
stress_impact = {
arrogant = medium_stress_impact_gain
paranoid = minor_stress_impact_gain
}
}
}
}
scope:recipient = {
if = {
limit = { has_character_flag = fp1_dreams_of_shieldpersondom }
remove_character_flag = fp1_dreams_of_shieldpersondom
}
}
}
}
auto_accept = {
custom_description = {
text = "spending_hook"
subject = scope:actor
object = scope:recipient
AND = {
always = scope:hook
scope:actor = { has_strong_hook = scope:recipient }
}
}
}
send_option = {
is_valid = {
scope:actor = {
has_usable_hook = scope:recipient
}
}
flag = hook
localization = SCHEME_HOOK
}
should_use_extra_icon = {
scope:actor = { has_usable_hook = scope:recipient }
}
extra_icon = "gfx/interface/icons/character_interactions/hook_icon.dds"
send_options_exclusive = no
cost = {
prestige = scope:actor.minor_prestige_value
}
ai_potential = {
#Has access to the appropriate cultural parameter.
culture = { has_cultural_parameter = has_access_to_shieldmaidens }
prestige > major_prestige_value
has_fp1_dlc_trigger = yes
is_physically_able_adult = yes
}
auto_accept = no
ai_accept = {
base = 0
modifier = {
trigger = {
always = scope:hook
}
add = 100
desc = SCHEME_WEAK_HOOK_USED
}
modifier = {
trigger = {
has_education_martial_trigger = yes
}
add = 20
desc = INTERACTION_MARTIAL_EDUCATION
}
# Weight up for personality values.
ai_value_modifier = {
who = scope:recipient
ai_boldness = {
if = {
limit = {
scope:recipient = {
NOT = { ai_boldness = 0 }
}
}
value = 0.5
}
}
ai_compassion = {
if = {
limit = {
scope:recipient = {
NOT = { ai_compassion = 0 }
}
}
value = -0.5
}
}
}
modifier = {
add = -1000
has_trait = craven
desc = INTERACTION_CRAVEN
}
modifier = {
add = -50
has_trait = content
desc = INTERACTION_CONTENT
}
modifier = {
add = -50
has_trait = humble
desc = INTERACTION_HUMBLE
}
modifier = {
add = -50
has_trait = lazy
desc = INTERACTION_LAZY
}
modifier = {
add = 100
has_trait = brave
desc = INTERACTION_BRAVE
}
modifier = {
add = 25
has_trait = ambitious
desc = INTERACTION_AMBITIOUS
}
}
ai_will_do = {
base = 100
}
}