# 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 } }