N3OW_Western_eastern_europe/events/dlc/fp1/fp1_shieldmaiden_events.txt

1427 lines
36 KiB
Text
Raw Normal View History

2025-12-16 13:42:24 +00:00
namespace = fp1_shieldmaiden
scripted_trigger wrong_gender_for_fighting_in_faith_trigger = {
#Has access to the appropriate cultural parameter.
culture = { has_cultural_parameter = has_access_to_shieldmaidens }
trigger_if = { # Has the Royal Court and thus can modify pillars
limit = {
has_dlc_feature = diverge_culture # Can modify pillars
}
OR = {
AND = {
culture = { has_cultural_parameter = martial_custom_male_only_combatant }
is_female = yes
}
AND = {
culture = { has_cultural_parameter = martial_custom_female_only_combatant }
is_male = yes
}
}
}
trigger_else = { # Does not have the Royal Court and thus combatant is governed by faith
OR = {
AND = {
faith = { has_doctrine_parameter = combatant_must_be_male_if_no_roco }
is_female = yes
}
AND = {
faith = { has_doctrine_parameter = combatant_must_be_female_if_no_roco }
is_male = yes
}
}
}
}
##################################################
# Shieldmaiden Challenges You
# by Ewan Cowhig Croft
# 0001 - 0010
##################################################
scripted_trigger likely_to_be_offended_list_trigger = {
trigger_if = { # Has the Royal Court and thus can modify pillars
limit = { has_dlc_feature = diverge_culture }
culture = {
NOT = { has_cultural_parameter = martial_custom_equal_combatant }
}
}
trigger_else = {
#Separate religions already think your ways are terrible already, co-religionists think you're making them look bad.
religion = root.religion
#No bias, no problem.
faith = {
NOT = { has_doctrine_parameter = combatant_can_be_either_gender_if_no_roco }
}
}
culture = {
# Warrior by merit, if strong enought you can be a warrior regardless of gender
NOT = { has_cultural_parameter = high_prowess_ignores_knight_restrictions }
}
#Existing shieldmaidens cut slack.
NOT = { has_trait = shieldmaiden }
age >= childhood_education_start_age
}
scripted_trigger valid_to_become_shieldperson_trigger = {
wrong_gender_for_fighting_in_faith_trigger = yes
is_available_ai_adult = yes
prowess >= decent_skill_rating
NOT = { has_trait = shieldmaiden }
NOT = { has_trait = craven }
}
scripted_trigger child_dreams_of_shieldpersonhood_trigger = {
valid_to_become_shieldperson_trigger = yes
is_courtier_of = root
location = root.location
has_character_flag = fp1_dreams_of_shieldpersondom
}
# A wrong-gender courtier wishes to fight for you
fp1_shieldmaiden.0001 = {
type = character_event
title = fp1_shieldmaiden.0001.t
desc = fp1_shieldmaiden.0001.desc
theme = martial
left_portrait = {
character = scope:shieldmaiden
animation = personality_bold
}
right_portrait = {
character = scope:challenged_knight
animation = dismissal
}
override_background = { reference = throne_room }
trigger = {
#DLC check.
has_fp1_dlc_trigger = yes
#Standard checks.
is_available_at_peace_adult = yes
is_landed = yes
NOT = { has_character_flag = had_event_fp1_shieldmaiden_0001 }
#Has access to the appropriate cultural parameter.
culture = { has_cultural_parameter = has_access_to_shieldmaidens }
#Your society must consider one gender or the other lesser.
trigger_if = { # Has the Royal Court and thus can modify pillars
limit = { has_dlc_feature = diverge_culture }
culture = { NOT = { has_cultural_parameter = martial_custom_equal_combatant } }
}
trigger_else = {
faith = { NOT = { has_doctrine_parameter = combatant_can_be_either_gender_if_no_roco } }
}
#You've got to have at least one suitable courtier or guest.
any_courtier_or_guest = { valid_to_become_shieldperson_trigger = yes }
#Aaaand you need a decent knight to be challenged.
any_knight = {
is_available_ai_adult = yes
is_ruler = no
wrong_gender_for_fighting_in_faith_trigger = no
NOT = { has_trait = shieldmaiden }
}
}
weight_multiplier = {
base = 1
#More likely if you're a ruling wrong-gender person yourself.
modifier = {
add = 1
wrong_gender_for_fighting_in_faith_trigger = yes
}
#Even more so if you're actually a shieldmaiden yourself.
modifier = {
add = 1
has_trait = shieldmaiden
}
# Weight up drastically if one of your children wishes to become a shieldmaiden.
modifier = {
add = 10
any_child = { child_dreams_of_shieldpersonhood_trigger = yes }
}
}
immediate = {
#Put the event on cooldown for a decade.
add_character_flag = {
flag = had_event_fp1_shieldmaiden_0001
days = 3650
}
#Sort the best possible shieldmaiden.
ordered_courtier_or_guest = {
# Grab children who were promised first.
limit = {
is_child_of = root
child_dreams_of_shieldpersonhood_trigger = yes
}
# Otherwise, look down available courtiers.
alternative_limit = {
valid_to_become_shieldperson_trigger = yes
#Check that it makes sense for this character to ask to be your shieldmaiden.
OR = {
#Meaning they should either not be one already...
NOT = { has_trait = shieldmaiden }
#... or be a wandering shieldmaiden.
is_pool_guest = yes
}
}
order_by = {
value = prowess
if = {
limit = { has_trait = brave }
add = 10
}
if = {
limit = { has_trait = craven }
add = -10
}
if = {
limit = { has_trait = ambitious }
add = 10
}
if = {
limit = { has_trait = content }
add = -10
}
if = {
limit = { has_trait = arrogant }
add = 5
}
if = {
limit = { has_trait = humble }
add = -5
}
if = {
limit = { has_trait = gregarious }
add = 5
}
if = {
limit = { has_trait = shy }
add = -5
}
}
save_scope_as = shieldmaiden
}
#And a suitable knight.
ordered_knight = {
limit = {
is_available_ai_adult = yes
is_ruler = no
wrong_gender_for_fighting_in_faith_trigger = no
NOT = { has_trait = shieldmaiden }
}
order_by = prowess
save_scope_as = challenged_knight
}
#For reference, add all courtiers & vassals who are likely to be offended if you just let any old wrong-gender human defy societal gender norms.
every_courtier = {
limit = { likely_to_be_offended_list_trigger = yes }
add_to_list = prejudiced_courtiers_list
}
every_vassal = {
limit = { likely_to_be_offended_list_trigger = yes }
add_to_list = prejudiced_courtiers_list
}
#Finally, if scope:shieldmaiden has dreamt of this day, clear the dream. Hopefully it went positively!
scope:shieldmaiden = {
if = {
limit = { has_character_flag = fp1_dreams_of_shieldpersondom }
remove_character_flag = fp1_dreams_of_shieldpersondom
}
}
}
#You allow them to fight your knight.
option = {
name = fp1_shieldmaiden.0001.a
scope:challenged_knight = {
#Your knight may hurt the prospective shieldmaiden.
scope:shieldmaiden = {
random = {
chance = scope:challenged_knight.prowess
increase_wounds_no_death_effect = { REASON = duel }
}
}
#And, depending on how fearsome they were, your knight may have been hurt right back.
random = {
chance = scope:shieldmaiden.prowess
increase_wounds_no_death_effect = { REASON = duel }
}
#Sort the duel.
duel = {
skill = prowess
target = scope:shieldmaiden
#Your knight defeats the prospective shieldmaiden.
40 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = fp1_shieldmaiden.0001.a.tt_success
root = {
send_interface_toast = {
title = fp1_shieldmaiden.0001.a.tt_success
left_icon = scope:shieldmaiden
scope:shieldmaiden = {
#scope:shieldmaiden is a tad miffed.
add_opinion = {
target = scope:challenged_knight
modifier = angry_opinion
opinion = -20
}
}
#For your trouble, you and the knight split the prestige.
add_prestige = minor_prestige_gain
scope:challenged_knight = { add_prestige = minor_prestige_gain }
}
}
}
#Your knight is defeated.
60 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = fp1_shieldmaiden.0001.a.tt_failure
root = {
send_interface_toast = {
title = fp1_shieldmaiden.0001.a.tt_failure
left_icon = scope:shieldmaiden
scope:shieldmaiden = {
#Officially designated a shieldmaiden!
add_trait = shieldmaiden
#Happy with the outcome of the duel.
add_opinion = {
target = scope:challenged_knight
modifier = pleased_opinion
opinion = 20
}
#If scope:shieldmaiden is a guest, you get them for free.
if = {
limit = { is_pool_guest = yes }
root = { add_courtier = scope:shieldmaiden }
}
}
}
}
}
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_honor = 0.25
ai_energy = -0.25
ai_boldness = -0.25
}
modifier = { #Cowardly shieldmaidens don't see the necessity of a fight.
add = -40
has_trait = shieldmaiden
has_trait = craven
}
modifier = { #Brave shieldmaidens, on the other hand, will insist you earn it (either way).
add = 20
has_trait = shieldmaiden
has_trait = brave
}
}
}
#You take the challenge yourself.
option = {
name = fp1_shieldmaiden.0001.b
#You may have hurt the prospective shieldmaiden in the duel.
scope:shieldmaiden = {
random = {
chance = root.prowess
increase_wounds_no_death_effect = { REASON = duel }
}
}
#Plus they may have hurt you right back.
random = {
chance = scope:shieldmaiden.prowess
increase_wounds_no_death_effect = { REASON = duel }
}
#Sort the duel.
duel = {
skill = prowess
target = scope:shieldmaiden
#You defeat the prospective shieldmaiden.
40 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = fp1_shieldmaiden.0001.b.tt_success
send_interface_toast = {
title = fp1_shieldmaiden.0001.b.tt_success
left_icon = scope:shieldmaiden
scope:shieldmaiden = {
#scope:shieldmaiden is a tad miffed.
add_opinion = {
target = root
modifier = angry_opinion
opinion = -20
}
}
#Since you fought yourself, you get all the prestige.
add_prestige = medium_prestige_gain
}
}
#You are defeated.
60 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = fp1_shieldmaiden.0001.b.tt_failure
send_interface_toast = {
title = fp1_shieldmaiden.0001.b.tt_failure
left_icon = scope:shieldmaiden
scope:shieldmaiden = {
#Officially designated a shieldmaiden!
add_trait = shieldmaiden
#Happy with the outcome of the duel.
add_opinion = {
target = root
modifier = pleased_opinion
opinion = 20
}
#If scope:shieldmaiden is a guest, you get them for free.
if = {
limit = { is_pool_guest = yes }
root = { add_courtier = scope:shieldmaiden }
}
}
}
}
}
stress_impact = {
brave = medium_stress_impact_loss
craven = medium_stress_impact_gain
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_boldness = 0.5
ai_vengefulness = 0.25
}
modifier = { #Weight up for stress.
add = 20
has_trait = brave
}
modifier = { #Weight down for stress.
add = -20
has_trait = craven
}
modifier = { #Cowardly shieldmaidens don't see the necessity of a fight.
add = -40
has_trait = shieldmaiden
has_trait = craven
}
modifier = { #Brave shieldmaidens, on the other hand, will insist you earn it (either way).
add = 20
has_trait = shieldmaiden
has_trait = brave
}
}
}
#Accept them outright.
option = {
name = fp1_shieldmaiden.0001.c
scope:shieldmaiden = {
#Grant the shieldmaiden trait.
add_trait = shieldmaiden
#Opinion gain with new shieldmaiden.
add_opinion = {
target = root
modifier = fp1_accepted_my_sword_opinion
}
#If scope:shieldmaiden is a guest, you get them for free.
if = {
limit = { is_pool_guest = yes }
root = { add_courtier = scope:shieldmaiden }
}
}
#Loyalty hook on the new shieldmaiden for your trust.
if = {
limit = {
NOR = {
has_hook_of_type = {
target = scope:shieldmaiden
type = loyalty_hook
}
has_hook_of_type = {
target = scope:shieldmaiden
type = ritual_best_friend_hook
}
}
}
if = {
limit = {
has_hook = scope:shieldmaiden
}
hidden_effect = { remove_hook = { target = scope:shieldmaiden } }
}
add_hook = {
type = loyalty_hook
target = scope:shieldmaiden
}
}
#Opinion loss with all courtiers who do not feel they should be able to fight.
if = {
limit = {
any_in_list = {
list = prejudiced_courtiers_list
count >= 1
}
}
every_in_list = {
list = prejudiced_courtiers_list
limit = {
#Exempt shieldmaidens; we do this at this point, otherwise the shieldmaiden themself will objet to their own shieldmaidenry.
NOT = { has_trait = shieldmaiden }
}
custom = fp1_accepted_shieldmaiden_without_question
add_opinion = {
target = root
modifier = fp1_defied_religious_traditions_opinion
}
}
}
stress_impact = {
arbitrary = minor_stress_impact_loss
just = minor_stress_impact_gain
arrogant = medium_stress_impact_gain
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_compassion = 0.5
ai_honor = 0.25
ai_zeal = -0.25
}
modifier = { #Weight down for stress.
add = 10
has_trait = arbitrary
}
modifier = { #Weight up for stress.
add = -10
has_trait = just
}
modifier = { #Weight up for stress.
add = -20
has_trait = arrogant
}
modifier = { #Cowardly shieldmaidens don't see the necessity of a fight.
add = 40
has_trait = shieldmaiden
has_trait = craven
}
modifier = { #Brave shieldmaidens, on the other hand, will insist you earn it.
add = -40
has_trait = shieldmaiden
has_trait = brave
}
}
}
#Reject them outright.
option = {
name = fp1_shieldmaiden.0001.d
#Hefty opinion loss.
reverse_add_opinion = {
target = scope:shieldmaiden
modifier = fp1_rejected_my_sword_opinion
}
#Stepped rivalry between you and the potential shieldmaiden.
progress_towards_rival_effect = {
REASON = rival_shieldmaiden_declined
CHARACTER = scope:shieldmaiden
OPINION = 0
}
stress_impact = {
arbitrary = minor_stress_impact_loss
arrogant = medium_stress_impact_loss
just = minor_stress_impact_gain
humble = medium_stress_impact_gain
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_zeal = 0.25
ai_compassion = -0.25
ai_honor = -0.25
}
modifier = { #Weight up for stress.
add = 10
has_trait = arbitrary
}
modifier = { #Weight up for stress.
add = 20
has_trait = arrogant
}
modifier = { #Weight down for stress.
add = -10
has_trait = just
}
modifier = { #Weight down for stress.
add = -20
has_trait = humble
}
modifier = { #Shieldmaidens are, themselves, more likely to give someone a shot.
add = -40
has_trait = shieldmaiden
}
}
}
}
##################################################
# Shieldmaiden Stymies an Escape Attempt
# by Ewan Cowhig Croft
# 0011 - 0020
##################################################
# A shieldmaiden stops your escape attempt in its tracks.
fp1_shieldmaiden.0011 = {
type = character_event
title = fp1_shieldmaiden.0011.t
desc = fp1_shieldmaiden.0011.desc
theme = prison
left_portrait = {
character = scope:prisoner
animation = fear
}
right_portrait = {
character = scope:shieldmaiden
animation = disapproval
}
trigger = {
#DLC check.
has_fp1_dlc_trigger = yes
#Requires a shieldmaiden to get going.
imprisoner = {
any_courtier = { suitable_shieldmaiden_gaoler_trigger = yes }
}
}
immediate = {
play_music_cue = "mx_cue_prison"
save_scope_as = prisoner
imprisoner = {
#Grab an appropriate shieldmaiden.
random_courtier = {
limit = { suitable_shieldmaiden_gaoler_trigger = yes }
save_scope_as = shieldmaiden
}
#Inform the imprisoner so that they're aware they're getting value for money.
trigger_event = fp1_shieldmaiden.0012
}
scope:imprisoner = {
add_opinion = {
target = root
modifier = respect_opinion
opinion = -20
}
}
}
#The shieldmaiden lays the smackdown.
option = {
name = fp1_shieldmaiden.0011.a
increase_wounds_no_death_effect = { REASON = beaten }
}
}
# A shieldmaiden has stopped one of your prisoners escaping.
fp1_shieldmaiden.0012 = {
type = character_event
title = fp1_shieldmaiden.0012.t
desc = fp1_shieldmaiden.0012.desc
theme = prison
left_portrait = {
character = scope:prisoner
animation = fear
}
right_portrait = {
character = scope:shieldmaiden
animation = disapproval
}
trigger = {
scope:prisoner = {
is_of_major_or_minor_interest_trigger = { CHARACTER = scope:imprisoner }
}
}
immediate = {
play_music_cue = "mx_cue_prison"
#Show the wounds.
show_as_tooltip = {
scope:prisoner = {
increase_wounds_effect = { REASON = beaten }
}
}
}
#Good job!
option = {
name = fp1_shieldmaiden.0012.a
scope:shieldmaiden = {
add_opinion = {
target = scope:imprisoner
modifier = compliment_opinion
opinion = 10
}
}
}
#Bad job! [in case this was an overreaction]
option = {
name = fp1_shieldmaiden.0012.b
scope:shieldmaiden = {
add_opinion = {
target = scope:imprisoner
modifier = annoyed_opinion
opinion = -10
}
}
}
}
##################################################
# Shieldmaiden saves you from Murder Attempt
# by Petter Vilberg & Ewan Cowhig Croft
# 0021 - 0030
##################################################
scripted_trigger suitable_shieldmaiden_savior_trigger = {
has_trait = shieldmaiden
bodyguard_will_actually_do_job_trigger = yes
}
# Scheme owner: shieldmaiden intervenes in murder.
fp1_shieldmaiden.0021 = {
type = character_event
window = scheme_failed_event
title = fp1_shieldmaiden.0021.t
desc = {
first_valid = {
triggered_desc = {
trigger = { scope:murder_method = flag:hired_thugs }
desc = fp1_shieldmaiden.0021.desc.thugs
}
triggered_desc = {
trigger = { scope:murder_method = flag:riled_up_mob }
desc = fp1_shieldmaiden.0021.desc.mob
}
triggered_desc = {
trigger = { scope:murder_method = flag:lured_into_forest }
desc = fp1_shieldmaiden.0021.desc.lured_into_forest
}
triggered_desc = {
trigger = { scope:murder_method = flag:child_pushed }
desc = fp1_shieldmaiden.0021.desc.child_pushed
}
desc = fp1_shieldmaiden.0021.desc.assassin
}
triggered_desc = {
trigger = { exists = local_var:shieldmaiden_dies }
desc = fp1_shieldmaiden.0021.shieldmaiden_dies
}
}
theme = murder_scheme
left_portrait = {
character = scope:owner
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
center_portrait = {
character = scope:bodyguard
triggered_animation = {
trigger = { is_alive = no }
animation = map_fear
}
animation = random_weapon_aggressive
camera = camera_event_center_pointing_left
}
right_portrait = {
character = scope:target
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = rage
}
animation = paranoia
}
widget = {
gui = "event_window_widget_scheme"
container = "custom_widgets_container"
}
trigger = {
#DLC check.
has_fp1_dlc_trigger = yes
scope:target = {
any_court_position_holder = {
type = bodyguard_court_position
suitable_shieldmaiden_savior_trigger = yes
}
}
}
immediate = {
# Select a murder method.
random_list = {
100 = {
save_scope_value_as = {
name = murder_method
value = flag:hired_assassin
}
}
100 = {
save_scope_value_as = {
name = murder_method
value = flag:hired_thugs
}
}
100 = {
save_scope_value_as = {
name = murder_method
value = flag:riled_up_mob
}
}
100 = {
save_scope_value_as = {
name = murder_method
value = flag:lured_into_forest
}
}
100 = {
save_scope_value_as = {
name = murder_method
value = flag:child_pushed
}
# Try to grab a suitable thing to lure them in with too.
rooftop_murder_lure_for_child_effect = yes
}
}
# Sort our shieldmaiden
scope:target = {
ordered_court_position_holder = {
type = bodyguard_court_position
limit = { suitable_shieldmaiden_savior_trigger = yes }
order_by = { value = murder_weight_best_bodyguard_value }
save_scope_as = shieldmaiden
}
}
hidden_effect = {
if = {
limit = {
# Shieldmaidens can't die from some murder methods.
NOR = {
scope:murder_method = flag:lured_into_forest
scope:murder_method = flag:child_pushed
}
}
random = {
chance = {
value = 75
subtract = scope:shieldmaiden.prowess
}
set_local_variable = {
name = shieldmaiden_dies
value = yes
}
}
}
}
if = {
limit = { exists = local_var:shieldmaiden_dies }
show_as_tooltip = {
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:shieldmaiden
REASON = death_murder
}
}
}
random_dummy_gender_assassin_effect = yes
murder_failure_effect = yes
}
#It's over.
option = { name = fp1_shieldmaiden.0021.a }
#It's not over till I say it's over!
option = {
name = fp1_shieldmaiden.0021.b
trigger = {
NOT = { exists = scope:scheme_discovered }
}
restart_murder_scheme_effect = yes
}
# Fire the rest of the outcome.
after = {
scope:target = { trigger_event = fp1_shieldmaiden.0022 }
}
}
# Shieldmaiden saves you from murder
fp1_shieldmaiden.0022 = {
type = character_event
window = scheme_target_event
title = fp1_shieldmaiden.0022.t
desc = {
# This block is only for the setup of child_pushed.
first_valid = {
triggered_desc = {
trigger = {
scope:murder_method = flag:child_pushed
exists = scope:child_pushed_dog
}
desc = murder_outcome.5001.child_pushed_dog
}
triggered_desc = {
trigger = {
scope:murder_method = flag:child_pushed
exists = scope:child_pushed_cat
}
desc = murder_outcome.5001.child_pushed_cat
}
triggered_desc = {
trigger = {
scope:murder_method = flag:child_pushed
exists = scope:child_pushed_toy
}
desc = murder_outcome.5001.child_pushed_toy
}
triggered_desc = {
trigger = {
scope:murder_method = flag:child_pushed
}
desc = murder_outcome.5001.child_pushed
}
}
# Shieldmaided saves you!
first_valid = {
triggered_desc = {
trigger = { scope:murder_method = flag:hired_thugs }
desc = fp1_shieldmaiden.0022.desc.thugs
}
triggered_desc = {
trigger = { scope:murder_method = flag:riled_up_mob }
desc = fp1_shieldmaiden.0022.desc.mob
}
triggered_desc = {
trigger = { scope:murder_method = flag:lured_into_forest }
desc = fp1_shieldmaiden.0022.desc.lured_into_forest
}
triggered_desc = {
trigger = { scope:murder_method = flag:child_pushed }
desc = fp1_shieldmaiden.0022.desc.child_pushed
}
desc = fp1_shieldmaiden.0022.desc.assassin
}
# ...but did they pay the ultimate price?
first_valid = {
triggered_desc = {
trigger = {
exists = local_var:shieldmaiden_dies
scope:murder_method = flag:hired_assassin
}
desc = fp1_shieldmaiden.0022.desc.assassin.shieldmaiden_dies
}
triggered_desc = {
trigger = {
exists = local_var:shieldmaiden_dies
scope:murder_method = flag:hired_thugs
}
desc = fp1_shieldmaiden.0022.desc.thugs.shieldmaiden_dies
}
triggered_desc = {
trigger = {
exists = local_var:shieldmaiden_dies
scope:murder_method = flag:riled_up_mob
}
desc = fp1_shieldmaiden.0022.desc.mob.shieldmaiden_dies
}
triggered_desc = {
trigger = {
NOT = { exists = local_var:shieldmaiden_dies }
scope:murder_method = flag:riled_up_mob
}
desc = fp1_shieldmaiden.0022.desc.mob.shieldmaiden_lives
}
}
# And who was responsible!?
triggered_desc = {
trigger = { exists = scope:scheme_discovered }
desc = fp1_shieldmaiden.0022.owner_discovered
}
}
theme = murder_scheme
override_background = {
trigger = { scope:murder_method = flag:hired_thugs }
reference = wilderness_scope
}
override_background = {
trigger = {
OR = {
scope:murder_method = flag:riled_up_mob
scope:murder_method = flag:child_pushed
}
}
reference = courtyard
}
override_background = {
trigger = { scope:murder_method = flag:lured_into_forest }
reference = wilderness_forest
}
left_portrait = {
character = scope:target
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = rage
}
animation = paranoia
}
center_portrait = {
character = scope:bodyguard
triggered_animation = {
trigger = { is_alive = no }
animation = map_fear
}
animation = random_weapon_aggressive
}
right_portrait = {
character = scope:owner_to_reveal
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
immediate = {
if = {
limit = { scope:murder_method = flag:hired_thugs }
scope:home_province = { save_scope_as = background_wilderness_scope }
}
# Handle the death of the Shieldmaiden if necessary
if = {
limit = { exists = local_var:shieldmaiden_dies }
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:shieldmaiden
REASON = death_murder
}
}
}
#Who could do such a thing?
option = {
name = fp1_shieldmaiden.0022.a
trigger = {
NOT = { exists = scope:scheme_discovered }
}
custom_tooltip = murder_save.failure_unknown_owner_tt
}
#Vengeance!
option = {
name = fp1_shieldmaiden.0022.b
trigger = { exists = scope:scheme_discovered }
custom_tooltip = murder_save.failure_known_owner_tt
}
after = {
add_character_modifier = {
modifier = watchful_modifier
days = watchful_modifier_duration
}
}
}
##################################################
# Shieldmaiden has Developed Mad Skills
# by Ewan Cowhig Croft
# 0031 - 0040
##################################################
scripted_trigger valid_for_shieldmaiden_veterancy = {
# Must actually have the shieldmaiden trait.
has_trait = shieldmaiden
# Must still be in a situation where shieldmaidenhood is exceptional.
wrong_gender_for_fighting_in_faith_trigger = yes
}
scripted_trigger valid_for_shieldmaiden_level_up = {
# Are they an eligible shieldmaiden?
valid_for_shieldmaiden_veterancy = yes
# Have they met the level up requirements?
has_variable = shieldmaiden_veterancy
this.var:shieldmaiden_veterancy >= shieldmaiden_veterancy_cap
# Already checked for a root shieldmaiden, but we re-check for courtiers.
is_available_at_peace_adult = yes
# Finally, they mustn't have all the shieldmaiden modifiers maxed out already.
NAND = {
has_character_modifier = shieldmaiden_level_martial_3_fp1_modifier
has_character_modifier = shieldmaiden_level_prowess_3_fp1_modifier
has_character_modifier = shieldmaiden_level_intrigue_3_fp1_modifier
}
}
# Track the number of valid battles as a shieldmaiden a character has been in.
fp1_shieldmaiden.0031 = {
hidden = yes
scope = combat_side
trigger = {
#DLC check.
has_fp1_dlc_trigger = yes
OR = {
any_side_commander = { valid_for_shieldmaiden_veterancy = yes }
any_side_knight = { valid_for_shieldmaiden_veterancy = yes }
}
}
immediate = {
# Sort side commander shieldmaidens.
every_side_commander = {
limit = { valid_for_shieldmaiden_veterancy = yes }
# Boost their veterancy if they already have it.
if = {
limit = { exists = var:shieldmaiden_veterancy }
change_variable = {
name = shieldmaiden_veterancy
add = 1
}
}
# Or else set it up otherwise.
else = {
set_variable = {
name = shieldmaiden_veterancy
value = 1
}
}
}
# Sort side knight shieldmaidens.
every_side_knight = {
limit = { valid_for_shieldmaiden_veterancy = yes }
if = {
limit = { exists = var:shieldmaiden_veterancy }
change_variable = {
name = shieldmaiden_veterancy
add = 1
}
}
else = {
set_variable = {
name = shieldmaiden_veterancy
value = 1
}
}
}
}
}
# Your shieldmaiden improves their skills.
fp1_shieldmaiden.0032 = {
type = character_event
title = fp1_shieldmaiden.0032.t
desc = {
first_valid = {
# Am *I* the shieldmaiden in question?
triggered_desc = {
trigger = { scope:shieldmaiden = root }
desc = fp1_shieldmaiden.0032.desc.root
}
# Or is it a courtier?
desc = fp1_shieldmaiden.0032.desc.courtier
}
}
theme = martial
left_portrait = {
character = scope:shieldmaiden
animation = rage
}
override_background = { reference = army_camp }
trigger = {
#DLC check.
has_fp1_dlc_trigger = yes
#Standard checks.
is_available_at_peace_adult = yes
NOT = { has_character_flag = had_event_fp1_shieldmaiden_0032 }
# Must either be or have a shieldmaiden who's at veterancy cap.
OR = {
valid_for_shieldmaiden_level_up = yes
any_courtier = { valid_for_shieldmaiden_level_up = yes }
}
}
weight_multiplier = {
base = 1
# Much more likely if you're a shieldmaiden yourself.
modifier = {
add = 2
has_trait = shieldmaiden
}
}
immediate = {
play_music_cue = "mx_cue_positive_effect"
add_character_flag = {
flag = had_event_fp1_shieldmaiden_0032
days = 1825
}
# Designate a valid shieldmaiden.
## First, we always level up root, if possible.
if = {
limit = { valid_for_shieldmaiden_level_up = yes }
save_scope_as = shieldmaiden
}
## Otherwise, we grab all relevant courtiers.
else = {
every_courtier = {
limit = { valid_for_shieldmaiden_level_up = yes }
add_to_list = veteran_shieldmaidens
}
}
## Select a suitable one from the list to be scope:shieldmaiden, prioritising the most veteran.
if = {
limit = {
NOT = { exists = scope:shieldmaiden }
}
ordered_in_list = {
list = veteran_shieldmaidens
order_by = var:shieldmaiden_veterancy
save_scope_as = shieldmaiden
}
}
# Next, we reduce scope:shieldmaiden's veterancy, as they'll be levelling it up in the event.
scope:shieldmaiden = {
change_variable = {
name = shieldmaiden_veterancy
subtract = shieldmaiden_veterancy_cap
}
}
}
# Martial: look how they command the shieldwall!
option = {
# Separate loc for first person POV.
name = {
trigger = { scope:shieldmaiden = root }
text = fp1_shieldmaiden.0032.a.root
}
# Aaaaand third person POV.
name = {
trigger = {
scope:shieldmaiden != root
}
text = fp1_shieldmaiden.0032.a.courtier
}
# Can't have the max-level version of this modifier.
trigger = {
NOT = {
scope:shieldmaiden = { has_character_modifier = shieldmaiden_level_martial_3_fp1_modifier }
}
}
# Process the level-up modifier for this stat block.
scope:shieldmaiden = {
# If we have no level on this path, give us the first rank.
if = {
limit = {
NOR = {
has_character_modifier = shieldmaiden_level_martial_1_fp1_modifier
has_character_modifier = shieldmaiden_level_martial_2_fp1_modifier
has_character_modifier = shieldmaiden_level_martial_3_fp1_modifier
}
}
add_character_modifier = shieldmaiden_level_martial_1_fp1_modifier
}
# If have the first level, quietly remove it and add the second.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_martial_1_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_martial_1_fp1_modifier }
add_character_modifier = shieldmaiden_level_martial_2_fp1_modifier
}
# If we have the second level, quietly remove it and add the third.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_martial_2_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_martial_2_fp1_modifier }
add_character_modifier = shieldmaiden_level_martial_3_fp1_modifier
}
}
# No stress involved.
ai_chance = {
base = 100
ai_value_modifier = {
ai_boldness = 0.25
ai_rationality = 0.25
}
}
}
# Prowess: see how they swing that sword!
option = {
# Separate loc for first person POV.
name = {
trigger = { scope:shieldmaiden = root }
text = fp1_shieldmaiden.0032.b.root
}
# Aaaaand third person POV.
name = {
trigger = {
scope:shieldmaiden != root
}
text = fp1_shieldmaiden.0032.b.courtier
}
# Can't have the max-level version of this modifier.
trigger = {
NOT = {
scope:shieldmaiden = { has_character_modifier = shieldmaiden_level_prowess_3_fp1_modifier }
}
}
# Process the level-up modifier for this stat block.
scope:shieldmaiden = {
# If we have no level on this path, give us the first rank.
if = {
limit = {
NOR = {
has_character_modifier = shieldmaiden_level_prowess_1_fp1_modifier
has_character_modifier = shieldmaiden_level_prowess_2_fp1_modifier
has_character_modifier = shieldmaiden_level_prowess_3_fp1_modifier
}
}
add_character_modifier = shieldmaiden_level_prowess_1_fp1_modifier
}
# If have the first level, quietly remove it and add the second.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_prowess_1_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_prowess_1_fp1_modifier }
add_character_modifier = shieldmaiden_level_prowess_2_fp1_modifier
}
# If we have the second level, quietly remove it and add the third.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_prowess_2_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_prowess_2_fp1_modifier }
add_character_modifier = shieldmaiden_level_prowess_3_fp1_modifier
}
}
# No stress involved.
ai_chance = {
base = 100
ai_value_modifier = {
ai_vengefulness = 0.25
ai_honor = 0.25
}
}
}
# Intrigue: never a finer backstabber!
option = {
# Separate loc for first person POV.
name = {
trigger = { scope:shieldmaiden = root }
text = fp1_shieldmaiden.0032.c.root
}
# Aaaaand third person POV.
name = {
trigger = {
scope:shieldmaiden != root
}
text = fp1_shieldmaiden.0032.c.courtier
}
# Can't have the max-level version of this modifier.
trigger = {
NOT = {
scope:shieldmaiden = { has_character_modifier = shieldmaiden_level_intrigue_3_fp1_modifier }
}
}
# Process the level-up modifier for this stat block.
scope:shieldmaiden = {
# If we have no level on this path, give us the first rank.
if = {
limit = {
NOR = {
has_character_modifier = shieldmaiden_level_intrigue_1_fp1_modifier
has_character_modifier = shieldmaiden_level_intrigue_2_fp1_modifier
has_character_modifier = shieldmaiden_level_intrigue_3_fp1_modifier
}
}
add_character_modifier = shieldmaiden_level_intrigue_1_fp1_modifier
}
# If have the first level, quietly remove it and add the second.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_intrigue_1_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_intrigue_1_fp1_modifier }
add_character_modifier = shieldmaiden_level_intrigue_2_fp1_modifier
}
# If we have the second level, quietly remove it and add the third.
else_if = {
limit = { has_character_modifier = shieldmaiden_level_intrigue_2_fp1_modifier }
hidden_effect = { remove_character_modifier = shieldmaiden_level_intrigue_2_fp1_modifier }
add_character_modifier = shieldmaiden_level_intrigue_3_fp1_modifier
}
}
# Minor stress revolving around paranoia: what if they backstab *YOU*, after all?
if = {
limit = {
scope:shieldmaiden != root
}
stress_impact = {
trusting = minor_stress_impact_loss
paranoid = minor_stress_impact_gain
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 0.5
ai_vengefulness = -0.5
}
modifier = { #Weight up for stress.
add = 10
scope:shieldmaiden != root
has_trait = trusting
}
modifier = { #Weight down for stress.
add = -10
scope:shieldmaiden != root
has_trait = paranoid
}
}
}
}