204 events

This commit is contained in:
Fishedotjpg 2025-12-15 17:27:21 +00:00
parent 888ff78a37
commit bb726490cf
203 changed files with 715955 additions and 0 deletions

195
N3OW/events/_events.info Normal file
View file

@ -0,0 +1,195 @@
=== Structure ===
Note: this is very very incomplete...
event_namespace.42 = {
type = character_event/letter_event/court_event/activity_event # Default to character, what type of event this is
scope = scope_type # Optional, defaults to character, will make this event fire with a different expected root scope. none can be used to have no scopes set up.
window = window_name # Optional, what special event file and widget in gui/event_windows should this event use, only used for character events
# If you have a cooldown, the recipient will get a variable saved with that duration. The variable name will be the event ID
# Anything that checks that an event is legal to fire will also check that the recipient doesn't have that variable
cooldown = {
days/weeks/months/years = script value
}
# DLC or Mod that this Event belongs to, shown in Event Window if set.
content_source = X
# Specify a character portrait to appear in the event on the specified position.
left_portrait = X
right_portrait = X
center_portrait = X # not used in all event types
lower_left_portrait = X
lower_center_portrait = X
lower_right_portrait = X
sender = X # for letter events, required
# X can be one of:
X = event target
X = {
character = event target
trigger = ... # optional, a trigger saying whether this portrait should be visible, in the scope of the portrait character, the event scope is accessible as root scope
animation = animation name # optional, the animation to show for this portrait. It's used if no triggered animations pass their trigger. The default animation will be used if nothing is this item is not specified.
scripted_animation = key_of_scripted_animation # optional, instead of 'animation' you can also define a 'scripted_animation'
# A list of triggered animations. The first triggered animation that passes the trigger check will be used.
triggered_animation = {
trigger = ...
animation = animation name
# Instead of 'animation' you can also define a 'scripted_animation'
scripted_animation = key_of_scripted_animation
### brief: camera ( database key, optional )
# A camera type defined for a triggered animation will override the default
# camera defined for the event portrait if that animation is chosen
#
camera = camera_name
}
triggered_animation = ...
# A list of triggered outfits. The first triggered otfit that passes the trigger check will be used.
triggered_outfit = {
trigger = ...
outfit_tags = ...
remove_default_outfit = ...
hide_info = ...
}
triggered_outfit = ...
# Override camera to be used instead of the normal event ones
camera = camera_key
outfit_tags = { tag1 tag2 } # Specifies outfit tags for this portrait in ascending priority (i.e. tag2 will "override" tag1 here if anything with tag2 is found in a specific portrait modifier category)
remove_default_outfit = yes/no # If set to yes, portrait modifier categories in which nothing matches any of the event tags will be disabled completely (no by default)
hide_info = yes/no # If set to yes, only the portrait will be shown, with no identifiable elements (no CoA, tooltips, clicks...) (no by default)
}
# Specify an artifact to appear in the event on the specified position
artifact = {
target = event target
position = lower_left_portrait/lower_center_portrait/lower_right_portrait
# Can't be in the same position as a portrait
trigger = ... # Optional, as for character portraits
}
# This will be run if a queued event (or one triggered immediately from script) does not fulfil its trigger
# Events failing to trigger from an on-action will *not* run this
on_trigger_fail = {
some effect
}
# Specify custom widgets to embed in the event. See section about Custom Widgets below.
widgets = {
widget = {
# Trigger that controls the availability of the widget. Scope: same as the event, after immediate effect. Default: always = yes
is_shown = {}
# Name of the widget to use. Must be at the path <event_window_widgets>/<widget_name>.gui
gui = "<widget_name>"
# Name of the widget where this custome widget will be insert
container = "<container_widget_name>"
# Some widgets require a custom controller (see below). Default: default
controller = <controller_type>
# Effect to set up the scope as required by the controller. Scope: same as the event, after immediate effect, doesn't modify the event scope, though. Default: {}
setup_scope = {}
}
}
widget = { ... } # alternative syntax for a single widget. Follows the same info as the widget in the widgets parameter
option = { # An option the player/AI can pick
# Localization key for the event option button text
name = X
# The effects that will be run when picking the options. Written directly here with no label
X..
# A trigger that has to be fulfilled for this option to be valid.
trigger = {}
# If the event is invalid, but this trigger is valid, then the option will be shown (but disabled).
# This behavior is also influenced by the EVENT_OPTIONS_SHOWN_HIDE_UNAVAILABLE or SCHEME_PREPARATION_OPTIONS_SHOWN_HIDE_UNAVAILABLE defines depending on event type.
show_as_unavailable = {}
# Highlights the event portrait of this character while this option is hovered. This is in addition to the automatic highlighting when hovering an event option that has an effect that affects portrait characters.
highlight_portrait = scope:a_character
reason = <flag> # Special reason for why this option is unlocked, can be any arbitrary string, is be checked in the UI to show special by reason
# Parameters to impact the way ai-characters pick options to resolve their events
# We have 2 mutually exclusive parameters; ai_chance, and ai_will_select where the only difference is the syntax for calculating the value
ai_chance = { # See common/scripted_modifiers/_scripted_modifiers.info for more details
base = 10
modifier = {
add = 5
<trigger>
}
modifier = {
factor = 0.5
<trigger>
}
}
ai_will_select = { # See common/script_values/_script_values.info for more details
base = 10
if = {
limit = {
<trigger>
}
add = 5
}
else_if = {
limit = {
<trigger>
}
multiply = 0.5
}
}
}
theme = "" # Theme to use in the event. For a list, check: 00_event_themes.txt
override_background = { # A background that can be shown when the event pops up. This overrides the theme one. In case that there are multiples the first one that fits the trigger will be the one selected. In case none fits the ones inthe theme will be checked after.
trigger = {} # Receives the event scope to check if it's valid.
reference = "" # Path to the texture
}
override_transition = { # A transition that can be shown when the event pops up, before the event options and backgrounds. This overrides the theme one. In case that there are multiples the first one that fits the trigger will be the one selected. In case none fits the ones inthe theme will be checked after.
trigger = {} # Receives the event scope to check if it's valid.
reference = "" # Path to the texture
}
override_effect_2d = { # A 2d effect that can be put on top of the background. This overrides the theme one. In case that there are multiples the first one that fits the trigger will be the one selected. In case none fits the ones inthe theme will be checked after.
trigger = {} # Receives the event scope to check if it's valid.
reference = "" # key to the effect
}
override_icon = { # An icon that can be shown when the event pops up. This overrides the theme one. In case that there are multiples the first one that fits the trigger will be the one selected. In case none fits the ones inthe theme will be checked after.
trigger = {} # Receives the event scope to check if it's valid.
reference = "" # Path to the texture
}
override_header_background = { # The header asset located behind the event icon. This overrides the header asset defined by the theme. If there are multiples defined here, the first one that passes its trigger will be selected. If none are valid, then the theme's header asset will be used
trigger = {}
reference = ""
}
override_sound = { # A sound that can be played when the event pops up. This overrides the theme one. In case that there are multiples the first one that fits the trigger will be the one selected. In case none fits the ones inthe theme will be checked after.
trigger = {} # Receives the event scope to check if it's valid.
reference = "" # Reference of the sound
}
orphan = yes # The game will not log an error about this event being unreferenced. Useful for debug events
}
=== Custom Widgets ===
Custom widgets can be embedded into events.
GUI files must be placed at the event_window_widgets path (see paths.settings). The name of the file must match the widget name.
Some widgets that modify the game require a custom controller. This should be documented in the widget's GUI file.
The data context type available in the GUI depends on the controller type.
Some controllers require special scope setup, which should be documented under Notes below. Use the setup_scope effect for that.
Available controllers:
Controller Type | Data Context Name | Notes
------------------------+----------------------------------------+-------------------------------------------------------------------------------------------------------------
default | EventWindowWidget | Default controller, no special behavior
name_character | EventWindowWidgetNameCharacter | Changes a character's name. Scope must have the name_character_target saved scope.
text | EventWindowWidgetEnterText | Saves some text onto the character.
event_chain_progress | EventWindowWidgetChainProgress | Displays progress through an event chain, needs event_chain_length and event_chain_progress scope values set
struggle_info | EventWindowCustomWidgetStruggleInfo | Displays information for the struggle, needs "start" scope value set
situation_info | EventWindowCustomWidgetSituationInfo | Displays information for the situation

View file

@ -0,0 +1,891 @@
namespace = accolade
#Accolade rank gain notification
# by Jason Cantalini
accolade.0001 = {
hidden = yes
trigger = {
exists = acclaimed_knight
has_dlc_feature = accolades
}
immediate = {
scope:changing_accolade = {
acclaimed_knight = {
save_scope_as = acclaimed_knight
}
}
if = {
limit = {
scope:changing_accolade = {
accolade_rank >= 5
}
}
send_interface_message = {
type = msg_accolade_gained_rank
title = accolade.0001.notification_high
desc = accolade_rank_unlock_notification_tooltip_high
left_icon = scope:acclaimed_knight
}
}
else = {
send_interface_message = {
type = msg_accolade_gained_rank
title = accolade.0001.notification_low
desc = accolade_rank_unlock_notification_tooltip_low
left_icon = scope:acclaimed_knight
}
}
}
}
#Accolade rank loss notification
# by Jason Cantalini
accolade.0002 = {
hidden = yes
trigger = {
has_dlc_feature = accolades
}
immediate = {
if = {
limit = {
exists = scope:changing_accolade.acclaimed_knight
}
scope:changing_accolade = {
acclaimed_knight = {
save_scope_as = acclaimed_knight
}
}
if = {
limit = {
scope:changing_accolade = {
accolade_rank >= 5
}
}
send_interface_message = {
type = msg_accolade_lost_rank
title = accolade.0002.notification_high
left_icon = scope:acclaimed_knight
desc = {
first_valid = {
triggered_desc = {
trigger = {
scope:acclaimed_knight = {
is_alive = yes
}
}
desc = accolade_rank_loss_notification_tooltip_high
}
desc = accolade_rank_loss_notification_tooltip_high_dead
}
}
}
}
else_if = {
limit = {
scope:changing_accolade = {
accolade_rank >= 1
}
}
send_interface_message = {
type = msg_accolade_lost_rank
title = accolade.0002.notification_low
left_icon = scope:acclaimed_knight
desc = {
first_valid = {
triggered_desc = {
trigger = {
scope:acclaimed_knight = {
is_alive = yes
}
}
desc = accolade_rank_loss_notification_tooltip_low
}
desc = accolade_rank_loss_notification_tooltip_low_dead
}
}
}
}
else = {
send_interface_message = {
type = msg_accolade_lost_rank
title = accolade.0002.notification_low
left_icon = scope:acclaimed_knight
desc = {
first_valid = {
triggered_desc = {
trigger = {
scope:acclaimed_knight = {
is_alive = yes
}
}
desc = accolade_rank_loss_notification_tooltip_no_rank
}
desc = accolade_rank_loss_notification_tooltip_no_rank_dead
}
}
}
}
}
else_if = {
limit = {
NOT = { exists = scope:changing_accolade.acclaimed_knight }
scope:changing_accolade = { accolade_rank >= 1 }
}
send_interface_message = {
type = msg_accolade_lost_rank
title = accolade.0002.notification_empty
desc = accolade_rank_loss_notification_tooltip_empty
}
}
else = {
send_interface_message = {
type = msg_accolade_lost_rank
title = accolade.0002.notification_low
desc = accolade_rank_loss_notification_tooltip_empty_no_rank
}
}
}
}
#Accolade becomes idle
# by Jason Cantalini
accolade.0003 = {
hidden = yes
trigger = {
has_dlc_feature = accolades
}
immediate = {
send_interface_toast = {
type = msg_accolade_active
title = accolade.0003.accolade_becomes_idle.tt
custom_tooltip = accolade.0003.accolade_becomes_idle_effects.tt
}
}
}
#Accolade succession with unchanged types
# by Jason Cantalini
accolade.0004 = {
hidden = yes
trigger = {
has_dlc_feature = accolades
}
immediate = {
send_interface_toast = {
type = msg_accolade_succession
title = accolade.0004.new_acclaimed_knight.tt
left_icon = scope:new_acclaimed_knight
custom_tooltip = accolade.0004.new_acclaimed_knight_name.tt
custom_tooltip = accolade.glory_loss.tt
}
}
}
#Accolade succession with new secondary type
# by Jason Cantalini
accolade.0005 = {
hidden = yes
trigger = {
has_dlc_feature = accolades
}
immediate = {
send_interface_toast = {
type = msg_accolade_succession_toast
title = accolade.0005.new_acclaimed_knight_new_type.tt
left_icon = scope:new_acclaimed_knight
custom_tooltip = accolade.0005.new_accolade_type.tt
custom_tooltip = accolade.0005.new_acclaimed_knight_succeeds.tt
custom_tooltip = accolade.glory_loss.tt
}
}
}
#Find Accolade Successor knight creation event
accolade.0006 = {
hidden = yes
trigger = {
exists = scope:accolade_in_need
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
is_healthy = yes
save_temporary_scope_as = temp_knight
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:temp_knight
}
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
is_healthy = yes
save_temporary_scope_as = temp_knight
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:temp_knight
}
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
#if = { # Balance testing variables
# limit = {
# NOT = {
# exists = global_var:accolade_fail
# }
# }
# set_global_variable = {
# name = accolade_fail
# value = 1
# }
#}
#else = {
# change_global_variable = {
# name = accolade_fail
# add = 1
# }
#}
accolade_character_creation_effect = yes
}
#else = { # Balance testing variables
# if = {
# limit = {
# NOT = {
# exists = global_var:accolade_success
# }
# }
# set_global_variable = {
# name = accolade_success
# value = 1
# }
# }
# else = {
# change_global_variable = {
# name = accolade_success
# add = 1
# }
# }
#}
if = {
limit = {
exists = scope:chosen_knight
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
# make sure the chosen knight is not already a courtier
scope:chosen_knight ?= {
NOT = { is_courtier_of = root }
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0007
days = 1
}
}
}
}
#Find Accolade Successor join event
accolade.0007 = {
hidden = yes
immediate = {
if = {
limit = {
exists = scope:accolade_in_need
exists = scope:chosen_knight
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
#SEND A TOAST NOTIFICATION
send_interface_toast = {
type = event_toast_effect_neutral
title = accolade.0007.notification
left_icon = scope:chosen_knight
custom_tooltip = accolade_call_acclaimed_knight_tooltip
hidden_effect = {
scope:chosen_knight = {
if = {
limit = {
NOT = { is_knight_of = root }
}
}
}
}
}
}
else = {
send_interface_message = {
type = event_accolade_bad_text
title = accolade.0007.notification_fail
desc = accolade_find_successor_fail_notification_tooltip
}
}
}
}
#Call Acclaimed Knight first knight
accolade.0008 = {
hidden = yes
trigger = {
exists = scope:empty_accolade_1
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
scope:empty_accolade_1 = {
save_scope_as = accolade_in_need
}
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
accolade_character_creation_effect = yes
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0013
days = 1
}
}
}
#Call Acclaimed Knight second knight
accolade.0009 = {
hidden = yes
trigger = {
exists = scope:empty_accolade_2
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
scope:empty_accolade_2 = {
save_scope_as = accolade_in_need
}
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_clergy = no
is_healthy = yes
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_clergy = no
is_healthy = yes
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
accolade_character_creation_effect = yes
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0013
days = 1
}
}
}
#Call Acclaimed Knight third knight
accolade.0010 = {
hidden = yes
trigger = {
exists = scope:empty_accolade_3
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
scope:empty_accolade_3 = {
save_scope_as = accolade_in_need
}
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
accolade_character_creation_effect = yes
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0013
days = 1
}
}
}
#Call Acclaimed Knight fourth knight
accolade.0011 = {
hidden = yes
trigger = {
exists = scope:empty_accolade_4
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
scope:empty_accolade_4 = {
save_scope_as = accolade_in_need
}
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
accolade_character_creation_effect = yes
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0013
days = 1
}
}
}
#Call Acclaimed Knight fifth knight
accolade.0012 = {
hidden = yes
trigger = {
exists = scope:empty_accolade_5
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
immediate = {
# try to find a pool character first
scope:empty_accolade_5 = {
save_scope_as = accolade_in_need
}
every_courtier_or_guest = {
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
every_pool_character = {
province = root.capital_province
limit = {
ep2_can_be_accolade_successor_base_trigger = yes
can_be_knight_trigger = { ARMY_OWNER = root }
is_valid_successor_for_accolade = scope:accolade_in_need
faith = {
faith_hostility_level = {
target = root.faith
value <= faith_astray_level
}
}
is_clergy = no
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = this
}
is_healthy = yes
}
add_to_list = potential_knights
}
random_in_list = {
list = potential_knights
save_scope_as = chosen_knight
}
# create a character if needed
if = {
limit = {
NOT = { exists = scope:chosen_knight }
}
accolade_character_creation_effect = yes
}
if = {
limit = {
can_recruit_character_to_court_trigger = {
RECRUITER = root
RECRUITEE = scope:chosen_knight
}
}
add_courtier = scope:chosen_knight
}
trigger_event = {
id = accolade.0013
days = 1
}
}
}
#Call Accolade Knight join event
accolade.0013 = {
hidden = yes
immediate = {
if = {
limit = {
exists = scope:accolade_in_need
exists = scope:chosen_knight
exists = root.capital_province
highest_held_title_tier >= tier_county
NOR = {
government_has_flag = government_is_theocracy
has_character_flag = had_accolade_successor_notification
}
}
#SEND A TOAST NOTIFICATION
send_interface_toast = {
type = event_toast_effect_neutral
title = accolade.0013.notification
left_icon = scope:chosen_knight
custom_tooltip = accolade_call_acclaimed_knight_tooltip
hidden_effect = {
scope:chosen_knight = {
if = {
limit = {
NOT = { is_knight_of = root }
}
set_knight_status = force
}
}
}
}
add_character_flag = {
flag = had_accolade_successor_notification
months = 6
}
}
else_if = {
limit = {
exists = scope:accolade_in_need
exists = scope:chosen_knight
exists = root.capital_province
highest_held_title_tier >= tier_county
NOT = { government_has_flag = government_is_theocracy }
}
#SEND A FEED NOTIFICATION FOR NEXT KNIGHTS
send_interface_message = {
type = event_accolade_good_with_text
title = accolade.0013.notification
desc = accolade_call_acclaimed_knight_tooltip
left_icon = scope:chosen_knight
scope:chosen_knight = {
if = {
limit = {
NOT = { is_knight_of = root }
}
set_knight_status = force
}
}
}
}
else = {
send_interface_message = {
type = event_accolade_bad_text
title = accolade.0013.notification_fail
desc = accolade_call_acclaimed_knight_fail_notification_tooltip
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

4625
N3OW/events/birth_events.txt Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,292 @@
#Events for blackmail
namespace = blackmail
########################
# Blackmail Handling
# 0001-0999
########################
#Character refuses to be blackmailed
blackmail.0001 = {
type = character_event
title = blackmail.0001.t
desc = blackmail.0001.desc
theme = intrigue
left_portrait = {
character = scope:recipient
animation = dismissal
}
trigger = {
exists = scope:target
scope:target = { can_be_exposed_by = root }
}
immediate = {
play_music_cue = mx_cue_murder
}
after = { remove_variable = currently_blackmailing }
option = {
name = blackmail.0001.a
scope:target = {
expose_secret = root
}
}
option = {
name = blackmail.0001.b
scope:target = {
disable_exposure_by = root
}
ai_chance = {
factor = 0
}
}
}
########################
# Blackmail-related stuff
# 1000-1999
########################
#Blackmailing someone causes Dread
blackmail.1001 = {
type = character_event
title = blackmail.1001.t
desc = blackmail.1001.desc
theme = intrigue
left_portrait = {
character = scope:blackmail_target
animation = worry
}
trigger = {
is_landed = yes
any_vassal = {
being_blackmailed_by_root_trigger = yes
}
NOT = { has_character_flag = had_event_blackmail_1001 }
}
weight_multiplier = {
base = 1
}
immediate = {
play_music_cue = mx_cue_murder
add_character_flag = {
flag = had_event_blackmail_1001
days = 3650
}
random_vassal = {
limit = {
root = {
OR = {
has_hook_of_type = {
target = prev
type = weak_blackmail_hook
}
has_hook_of_type = {
target = prev
type = strong_blackmail_hook
}
}
}
}
save_scope_as = blackmail_target
}
}
option = {
name = blackmail.1001.a
add_dread = medium_dread_gain
stress_impact = {
compassionate = medium_stress_impact_gain
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_boldness = 1
ai_vengefulness = 0.5
}
}
}
option = { #Assure your vassals no one has anything to fear
name = blackmail.1001.b
add_dread = medium_dread_loss
stress_impact = {
base = minor_stress_impact_gain
stubborn = minor_stress_impact_gain
callous = medium_stress_impact_gain
sadistic = medium_stress_impact_gain
}
ai_chance = {
base = 50
ai_value_modifier = {
ai_compassion = 2
ai_honor = 1
}
}
}
}
#Being under Blackmail causes Stress
blackmail.1002 = {
type = character_event
title = blackmail.1002.t
desc = blackmail.1002.desc
theme = intrigue
left_portrait = {
character = scope:blackmailer
animation = scheme
}
trigger = {
NOT = { has_character_flag = had_event_blackmail_1002 }
OR = {
any_vassal = {
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
AND = {
exists = liege
is_in_civil_war = no
liege = {
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
}
any_close_or_extended_family_member = {
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
}
}
weight_multiplier = {
base = 1
modifier = {
add = 0.5
has_trait = trusting
}
}
immediate = {
play_music_cue = mx_cue_murder
add_character_flag = {
flag = had_event_blackmail_1002
days = 3650
}
every_vassal = {
limit = {
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
add_to_temporary_list = blackmailers
}
liege = {
if = {
limit = {
is_in_civil_war = no
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
add_to_temporary_list = blackmailers
}
}
every_close_or_extended_family_member = {
limit = {
OR = {
has_hook_of_type = {
target = root
type = weak_blackmail_hook
}
has_hook_of_type = {
target = root
type = strong_blackmail_hook
}
}
}
add_to_temporary_list = blackmailers
}
random_in_list = {
list = blackmailers
save_scope_as = blackmailer
}
}
option = {
name = blackmail.1002.a
trigger = { NOT = { has_trait = trusting } }
show_as_unavailable = { always = yes }
stress_impact = {
base = medium_stress_gain
paranoid = minor_stress_impact_gain
}
ai_chance = {
base = 1000
}
}
option = {
name = blackmail.1002.b
trigger = {
has_trait = trusting
}
trait = trusting
stress_impact = {
base = minor_stress_impact_loss
}
ai_chance = {
base = 1000
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,703 @@
#Court Maintenance events of various persuasions
namespace = court_maintenance
#Children should acquire personality trait events
court_maintenance.0003 = {
hidden = yes
trigger = {
OR = {
is_adult = no
any_courtier_or_guest = {
is_adult = no
}
any_prisoner = {
is_adult = no
}
}
}
immediate = {
if = {
limit = {
is_adult = no
OR = {
age = 9
age = 11
age = 13
age >= 14 #Backup in case something has gone wrong
}
number_of_personality_traits < childhood_personality_trait_gain_limit
}
if = {
limit = {
age = 9
has_variable = reincarnation_of
can_become_reincarnation_trigger = yes
}
trigger_event = child_personality.9900
}
else = {
trigger_event = {
on_action = child_personality_gain
days = { 1 360 }
}
}
}
every_courtier_or_guest = {
limit = {
is_adult = no
OR = {
age = 9
age = 11
age = 13
age >= 14 #Backup in case something has gone wrong
}
number_of_personality_traits < childhood_personality_trait_gain_limit
}
trigger_event = {
on_action = child_personality_gain
days = { 1 360 }
}
}
#Small random chance to acquire a fourth personality trait
every_courtier_or_guest = {
limit = {
is_adult = no
number_of_personality_traits = childhood_personality_trait_gain_limit
number_of_personality_traits < personality_trait_limit
}
random = {
chance = childhood_fourth_personality_trait_chance
trigger_event = {
on_action = child_personality_gain
days = { 1 360 }
}
}
}
every_prisoner = {
limit = {
is_adult = no
OR = {
age = 9
age = 11
age = 13
age >= 14 #Backup in case something has gone wrong
}
number_of_personality_traits < childhood_personality_trait_gain_limit
}
trigger_event = {
on_action = child_personality_gain
days = { 1 360 }
}
}
#Small random chance to acquire a fourth personality trait
every_prisoner = {
limit = {
is_adult = no
number_of_personality_traits = childhood_personality_trait_gain_limit
number_of_personality_traits < personality_trait_limit
}
random = {
chance = childhood_fourth_personality_trait_chance
trigger_event = {
on_action = child_personality_gain
days = { 1 360 }
}
}
}
}
}
court_maintenance.0005 = {
hidden = yes
trigger = {
scope:new_employer = {
government_has_flag = government_is_holy_order
}
}
immediate = {
add_trait = order_member
}
}
#Absent from your court
court_maintenance.0010 = {
theme = crown
override_background = { reference = council_chamber }
type = character_event
title = court_maintenance.0010.t
left_portrait = {
character = scope:messenger
animation = worry
}
cooldown = { years = 5 }
trigger = {
always = no # Disabled for now
has_royal_court = yes
has_dlc_feature = royal_court
is_ai = no
is_available_adult = yes
is_at_war = no
}
desc = {
desc = court_maintenance.0010.desc
first_valid = {
triggered_desc = {
trigger = {
exists = scope:great_cgv_court
}
desc = court_maintenance.0010.desc.seeking_gainful_employment
}
desc = court_maintenance.0010.desc.general_ending
}
}
immediate = {
ordered_independent_ruler = {
order_by = court_grandeur_current
limit = {
faith.religion = root.faith.religion
in_diplomatic_range = root
this != root
}
alternative_limit = {
this != root
in_diplomatic_range = root
}
alternative_limit = {
this != root
}
save_scope_as = great_cgv_court
}
random_courtier = {
limit = {
has_any_court_position = yes
}
alternative_limit = {
is_available_adult = yes
}
save_scope_as = messenger
}
}
option = {
name = court_maintenance.0010.a
#Open Royal Court
custom_tooltip = court_maintenance.0010.a.tooltip
open_view_data = {
view = royal_court
player = root
}
}
option = {
name = {
text = court_maintenance.0010.b.paranoid
trigger = { has_trait = paranoid }
}
name = {
text = court_maintenance.0010.b.depressed
trigger = { has_trait = depressed }
}
name = {
text = court_maintenance.0010.b.brave
trigger = { has_trait = brave }
}
name = {
text = court_maintenance.0010.b
trigger = { always = yes }
}
change_current_court_grandeur = miniscule_court_grandeur_loss
if = {
limit = { exists = scope:great_cgv_court }
custom_tooltip = court_maintenance.0010.b.tooltip
}
hidden_effect = {
if = {
limit = { exists = scope:great_cgv_court }
random_courtier = {
limit = {
has_any_court_position = no
is_physically_able_ai_adult = yes
is_councillor = no
NOT = { is_vassal_of = root }
NOT = { is_close_family_of = ROOT }
}
set_employer = scope:great_cgv_court
return_to_court = yes
}
}
}
}
}
#Gained a Royal Court
court_maintenance.0011 = {
theme = new_royal_court
type = character_event
title = {
first_valid = {
triggered_desc = {
trigger = { tgp_is_ceremonial_regent_trigger = yes } # Not 'actual' ruler
desc = court_maintenance.0011.t.regent
}
desc = court_maintenance.0011.t
}
}
window = visit_settlement_window
desc = {
first_valid = {
triggered_desc = {
trigger = { tgp_is_ceremonial_regent_trigger = yes } # Not 'actual' ruler
desc = court_maintenance.0011.desc.regent
}
triggered_desc = {
trigger = { coronation_trigger = yes }
desc = court_maintenance.0011.desc.ach
}
desc = court_maintenance.0011.desc
}
}
left_portrait = {
character = root
animation = war_over_win
}
right_portrait = {
character = scope:messenger
animation = ecstasy
}
artifact = { # To display the dynasty banner in the event-window
target = scope:dynasty_banner
position = lower_center_portrait
}
artifact = { # To display the house banner in the event-window
target = scope:house_banner
position = lower_right_portrait
}
trigger = {
is_ai = no
is_landed = yes
has_dlc_feature = royal_court
# To avoid farming and duplication
OR = {
# No owned house banner
NOT = {
any_character_artifact = {
has_variable = banner_house
var:banner_house = root.house
}
}
AND = {
# Is Dynasty Head
OR = {
this = dynasty.dynast # Dynasty Head
any_parent = { # Parent landless
employer = prev
dynasty = prev.dynasty
this = dynasty.dynast
}
}
# Dynasty banner does not exist
NOT = {
any_character_artifact = {
has_variable = banner_dynasty
var:banner_dynasty = root.dynasty
}
}
}
}
}
immediate = {
tgp_save_realm_ceremonial_liege_effect = yes
if = {
limit = {
coronation_trigger = yes
NOT = { has_game_rule = coronation_laws_off }
}
coronation_reset_realm_law_effect = yes #we need to reset the crown laws immediately, not wait for the next tick
set_variable = coronation_discount
custom_tooltip = court_maintenance.0011.coronation_discount
# Coronations law
show_as_tooltip = {
add_realm_law = uncrowned
}
# Artifact for Coronations setup
create_proper_coronation_artifact_setup = yes
}
if = {
limit = {
exists = cp:councillor_chancellor
}
cp:councillor_chancellor = { save_scope_as = messenger }
}
else_if = {
limit = {
any_councillor = {
is_kurultai_trigger = yes
}
}
random_councillor = {
limit = {
is_kurultai_trigger = yes
}
save_scope_as = messenger
}
}
else = {
random_vassal = { save_scope_as = messenger }
}
#House banner
if = {
limit = {
tgp_is_ceremonial_regent_trigger = no
NOT = {
any_character_artifact = {
has_variable = banner_house
var:banner_house = root.house
}
}
}
set_variable = banner_from_house
create_artifact_wall_banner_effect = {
OWNER = root
CREATOR = scope:messenger
TARGET = root.house
}
if = { # For artifact portraits
limit = { exists = scope:newly_created_artifact }
scope:newly_created_artifact = { save_scope_as = house_banner }
}
}
#Dynasty banner
if = {
limit = {
tgp_is_ceremonial_regent_trigger = no
OR = {
this = dynasty.dynast # Dynasty Head
any_parent = { # Parent landless
employer = root
dynasty = root.dynasty
this = dynasty.dynast
}
}
NOT = {
any_character_artifact = {
has_variable = banner_dynasty
var:banner_dynasty = root.dynasty
}
}
}
set_variable = banner_from_dynasty
create_artifact_wall_banner_effect = {
OWNER = root
CREATOR = scope:messenger
TARGET = root.dynasty
}
if = { # For artifact portraits
limit = { exists = scope:newly_created_artifact }
scope:newly_created_artifact = { save_scope_as = dynasty_banner }
}
}
#Both
if = {
limit = {
exists = scope:house_banner
exists = scope:dynasty_banner
}
custom_tooltip = court_maintenance.0011.banner_tooltip
}
#House
else_if = {
limit = { exists = scope:house_banner }
custom_tooltip = court_maintenance.0011.banner_house_tooltip
}
#Dynasty
else = { custom_tooltip = court_maintenance.0011.banner_dynasty_tooltip }
# Add extra legitimacy, for the first time they gain the Kingdom title
add_legitimacy_effect = { LEGITIMACY = major_legitimacy_gain }
}
option = {
name = court_maintenance.0011.coronation
custom_tooltip = court_maintenance.0011.coronation.tooltip
trigger = {
coronation_trigger = yes
NOR = {
has_character_flag = had_coronation_prompt
has_game_rule = coronation_laws_off
tgp_is_ceremonial_regent_trigger = yes
}
}
if = { #ai should always go straight for it if they can
limit = { is_ai = yes can_host_activity = activity_coronation }
ai_attempt_to_host_activity = activity_coronation
}
else_if = { #if you already have a crown, a window opened for you sire
limit = { coronation_has_proper_artifact_trigger = yes is_ai = no }
open_view_data = {
view = activity_list_detail_host_window
data = activity_type:activity_coronation
player = root
}
}
else = { #Else we start creating a crown
create_proper_coronation_artifact_creation = yes
}
custom_tooltip = court_maintenance.0011.b.tooltip
ai_chance = { #AI should always start hosting coronations
base = 100
}
}
option = {
name = {
text = court_maintenance.0011.a
trigger = { tgp_is_ceremonial_regent_trigger = no } # Not 'actual' ruler
}
name = {
text = court_maintenance.0011.a.regent
trigger = { tgp_is_ceremonial_regent_trigger = yes } # Not 'actual' ruler
}
#Open Royal Court
custom_tooltip = court_maintenance.0011.a.tooltip
if = {
limit = {
coronation_trigger = yes
tgp_is_ceremonial_regent_trigger = no # Not 'actual' ruler
NOR = {
has_character_flag = had_coronation_prompt
has_game_rule = coronation_laws_off
government_has_flag = government_is_mandala
}
}
custom_tooltip = court_maintenance.0011.b.tooltip.ach
}
open_view_data = {
view = royal_court
player = root
}
}
option = {
name = court_maintenance.0011.b
custom_tooltip = court_maintenance.0011.b.tooltip
if = {
limit = {
coronation_trigger = yes
tgp_is_ceremonial_regent_trigger = no # Not 'actual' ruler
NOR = {
has_character_flag = had_coronation_prompt
has_game_rule = coronation_laws_off
government_has_flag = government_is_mandala
}
}
custom_tooltip = court_maintenance.0011.b.tooltip.ach
}
}
after = {
add_character_flag = had_coronation_prompt
if = {
limit = {
has_tgp_dlc_trigger = yes
government_allows = merit
NOT = { has_government = celestial_government } #Created from cycle
}
create_artifact_dynastic_imperial_seal_effect = {
OWNER = root
SMITH = root
}
}
}
}
#Dynasty Banner improves
scripted_trigger dynasty_banner_improve_rarity_trigger = {
trigger_if = {
limit = { root.dynasty.dynasty_prestige_level = max_dynasty_prestige_level }
NOT = { rarity = illustrious }
}
trigger_else_if = {
limit = { root.dynasty.dynasty_prestige_level >= high_dynasty_prestige_level }
NOR = {
rarity = famed
rarity = illustrious
}
}
trigger_else = {
root.dynasty.dynasty_prestige_level >= medium_dynasty_prestige_level
NOR = {
rarity = masterwork
rarity = famed
rarity = illustrious
}
}
}
scripted_effect dynasty_banner_improve_rarity_effect = {
if = {
limit = { scope:target.dynasty_prestige_level = max_dynasty_prestige_level }
set_artifact_rarity = illustrious
}
else_if = {
limit = { scope:target.dynasty_prestige_level >= high_dynasty_prestige_level }
set_artifact_rarity = famed
}
else = { set_artifact_rarity = masterwork }
hidden_effect = {
set_artifact_description = artifact_wall_banner_dynasty_description
clear_artifact_modifiers = yes
add_scaled_artifact_modifier_grandeur_small_effect = yes
add_scaled_artifact_modifier_dynasty_prestige_effect = yes
add_scaled_artifact_modifier_prestige_effect = yes
add_scaled_artifact_modifier_rulership_effect = yes
}
}
court_maintenance.0012 = {
theme = new_royal_court
type = character_event
title = court_maintenance.0012.t
desc = {
desc = court_maintenance.0012.desc
first_valid = {
triggered_desc = {
trigger = { scope:target.dynasty_prestige_level = max_dynasty_prestige_level }
desc = court_maintenance.0012.desc_illustrious
}
triggered_desc = {
trigger = { scope:target.dynasty_prestige_level >= high_dynasty_prestige_level }
desc = court_maintenance.0012.desc_masterwork
}
desc = court_maintenance.0012.desc_famed
}
}
left_portrait = {
character = root
animation = personality_honorable
}
artifact = { # To display the artifact in the event-window
target = scope:banner_scope
position = lower_right_portrait
}
trigger = {
any_character_artifact = {
trigger_if = { # To stop errors
limit = { exists = var:banner_dynasty } # is a dynasty banner
var:banner_dynasty = root.dynasty # of my dynasty
dynasty_banner_improve_rarity_trigger = yes # and should be a higher level
}
trigger_else = { always = no }
}
}
immediate = {
dynasty = { save_scope_as = target } # for banner desc
# save relevant banners (all just in case)
every_character_artifact = {
limit = {
has_variable = banner_dynasty
var:banner_dynasty = root.dynasty
dynasty_banner_improve_rarity_trigger = yes
}
add_to_list = dynasty_banner_list
}
random_in_list = {
list = dynasty_banner_list
limit = { is_equipped = yes }
alternative_limit = { always = yes }
save_scope_as = banner_scope
save_scope_as = newly_created_artifact
}
every_in_list = {
list = dynasty_banner_list
dynasty_banner_improve_rarity_effect = yes
}
}
option = {
name = court_maintenance.0012.a
}
}
court_maintenance.0013 = {
theme = new_royal_court
type = character_event
title = court_maintenance.0013.t
desc = {
desc = court_maintenance.0013.desc
first_valid = {
triggered_desc = {
trigger = {
exists = scope:banner_scope.var:banner_commissioner
scope:banner_scope.var:banner_commissioner != root
}
desc = court_maintenance.0013.desc_creator
}
desc = court_maintenance.0013.desc_fallback
}
}
left_portrait = {
character = root
animation = personality_honorable
}
artifact = { # To display the artifact in the event-window
target = scope:banner_scope
position = lower_right_portrait
}
trigger = {
any_character_artifact = { # Has more than one dynasty banner of own dynasty
count > 1
trigger_if = { # To stop errors
limit = { exists = var:banner_dynasty }
var:banner_dynasty = root.dynasty
}
trigger_else = { always = no }
}
}
immediate = {
every_character_artifact = { # Fetch all dynasty banners
limit = {
has_variable = banner_dynasty
var:banner_dynasty = root.dynasty
}
add_to_list = dynasty_banner_list
}
ordered_in_list = { # Save oldest dynasty banner
list = dynasty_banner_list
order_by = artifact_age
save_scope_as = banner_scope
}
every_in_list = { # Destroy all but oldest dynasty banner
list = dynasty_banner_list
limit = {
this != scope:banner_scope
}
destroy_artifact = this
}
}
option = {
name = court_maintenance.0013.a
custom_tooltip = court_maintenance.0013.tt
}
}

View file

@ -0,0 +1,261 @@
# Court Position re-assignment events
namespace = court_position_management_event
# Generic / landed character court position vacated event, offer the up to two best candidates by aptitude
court_position_management_event.0001 = {
type = character_event
title = court_position_management_event.0001.t
theme = court
desc = {
desc = court_position_management_event.0001.desc
triggered_desc = {
trigger = {
scope:employee = {
is_alive = no
}
}
desc = court_position_management_event.0001.desc.dead
}
triggered_desc = {
trigger = {
exists = scope:candidate_1
NOT = { exists = scope:candidate_2 }
}
desc = court_position_management_event.0001.desc.one_candidate
}
triggered_desc = {
trigger = {
exists = scope:candidate_1
exists = scope:candidate_2
}
desc = court_position_management_event.0001.desc.two_candidates
}
triggered_desc = {
trigger = {
NOT = { exists = scope:candidate_1 }
NOT = { exists = scope:candidate_2 }
}
desc = court_position_management_event.0001.desc.no_candidates
}
}
immediate = {
if = {
limit = {
NOT = { exists = scope:candidate_1 }
NOT = { exists = scope:candidate_2 }
}
save_scope_as = left_portrait_character
}
else = {
scope:candidate_1 = {
save_scope_as = left_portrait_character
}
}
}
left_portrait = {
character = scope:left_portrait_character
# If we have no candidates, we're just stand there, thinking
triggered_animation = {
trigger = { scope:left_portrait_character = root }
animation = thinking
}
}
right_portrait = scope:candidate_2
lower_center_portrait = scope:employee
# Pick candidate #1
option = {
name = court_position_management_event.0001.a
custom_tooltip = court_position_management_event.0001.a.aptitude
trigger = {
exists = scope:candidate_1
exists = scope:court_position_type
}
appoint_court_position = {
recipient = scope:candidate_1
court_position = scope:court_position_type
}
}
# Pick candidate #2
option = {
name = court_position_management_event.0001.b
custom_tooltip = court_position_management_event.0001.b.aptitude
trigger = {
exists = scope:candidate_2
}
appoint_court_position = {
recipient = scope:candidate_2
court_position = scope:court_position_type
}
}
# Go to a recruitment decision
option = {
name = court_position_management_event.0001.c
custom_tooltip = court_position_management_event.0001.c.tt
# Court positions that are valid in 'recruit_court_position_decision'
trigger = {
NOT = { exists = scope:candidate_1 }
NOT = { exists = scope:candidate_2 }
OR = {
scope:court_position_type = court_position_type:travel_leader_court_position
scope:court_position_type = court_position_type:court_physician_court_position
scope:court_position_type = court_position_type:wet_nurse_court_position
scope:court_position_type = court_position_type:charioteer_court_position
scope:court_position_type = court_position_type:chief_eunuch_court_position
scope:court_position_type = court_position_type:court_gardener_court_position
}
}
open_view_data = {
view = decision_detail
data = decision:recruit_court_position_decision
player = root
}
}
# I will figure this out myself
option = {
name = court_position_management_event.0001.d
custom_tooltip = court_position_management_event.0001.d.tt
trigger = {
exists = scope:candidate_1
}
open_view_data = {
view = appoint_position
data = scope:court_position_type
player = root
}
}
# Leave it open
option = {
name = court_position_management_event.0001.e
}
}
# Landless adventurer court position vacated event, offer the up to two best candidates by aptitude
court_position_management_event.0002 = {
type = character_event
title = court_position_management_event.0002.t
theme = landless_adventurer
desc = {
desc = court_position_management_event.0002.desc
triggered_desc = {
trigger = {
scope:employee = {
is_alive = no
}
}
desc = court_position_management_event.0002.desc.dead
}
triggered_desc = {
trigger = {
exists = scope:candidate_1
NOT = { exists = scope:candidate_2 }
}
desc = court_position_management_event.0002.desc.one_candidate
}
triggered_desc = {
trigger = {
exists = scope:candidate_1
exists = scope:candidate_2
}
desc = court_position_management_event.0002.desc.two_candidates
}
triggered_desc = {
trigger = {
NOT = { exists = scope:candidate_1 }
NOT = { exists = scope:candidate_2 }
}
desc = court_position_management_event.0002.desc.no_candidates
}
}
immediate = {
if = {
limit = {
NOT = { exists = scope:candidate_1 }
NOT = { exists = scope:candidate_2 }
}
save_scope_as = left_portrait_character
}
else = {
scope:candidate_1 = {
save_scope_as = left_portrait_character
}
}
}
left_portrait = {
character = scope:left_portrait_character
# If we have no candidates, we're just stand there, thinking
triggered_animation = {
trigger = { scope:left_portrait_character = root }
animation = thinking
}
}
right_portrait = scope:candidate_2
lower_center_portrait = scope:employee
# Pick candidate #1
option = {
name = court_position_management_event.0002.a
custom_tooltip = court_position_management_event.0002.a.aptitude
trigger = {
exists = scope:candidate_1
exists = scope:court_position_type
}
appoint_court_position = {
recipient = scope:candidate_1
court_position = scope:court_position_type
}
}
# Pick candidate #2
option = {
name = court_position_management_event.0002.b
custom_tooltip = court_position_management_event.0002.b.aptitude
trigger = {
exists = scope:candidate_2
}
appoint_court_position = {
recipient = scope:candidate_2
court_position = scope:court_position_type
}
}
# I will figure this out myself
option = {
name = court_position_management_event.0002.d
custom_tooltip = court_position_management_event.0002.d.tt
trigger = {
exists = scope:candidate_1
}
open_view_data = {
view = appoint_position
data = scope:court_position_type
player = root
}
}
# Leave it open
option = {
name = court_position_management_event.0002.e
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,720 @@
namespace = ach_maintenance_events
ach_maintenance_events.0001 = { # Clean up of Coronation realm law, will happen 1 tick after you gain the title (due to on_actions)
type = character_event
hidden = yes
trigger = {
coronation_trigger = yes
}
immediate = {
if = {
limit = {
NOT = {
has_game_rule = coronation_laws_off
}
}
if = {
limit = {
has_variable = crowned_king_var
NOT = { has_realm_law = crowned_king }
}
add_realm_law_skip_effects = crowned_king
}
else_if = {
limit = {
has_variable = crowned_emperor_var
NOT = { has_realm_law = crowned_emperor }
}
add_realm_law_skip_effects = crowned_emperor
}
else_if = {
limit = {
NOR = {
has_variable = crowned_king_var
has_variable = crowned_emperor_var
}
NOT = { has_realm_law = uncrowned }
}
add_realm_law_skip_effects = uncrowned
}
}
}
}
ach_maintenance_events.0002 = { # ACH Oath synergy culture rewards
type = character_event
hidden = yes
trigger = {
has_variable = mend_the_fracture_oath_target_culture
culture ?= {
has_cultural_tradition = oath_mend_the_fracture_tradition
}
top_liege = root
var:mend_the_fracture_oath_target_culture = {
has_cultural_tradition = oath_mend_the_fracture_tradition
NOT = { this = root.culture }
any_culture_county = {
count >= 3
top_liege = root.top_liege
}
}
}
immediate = {
# calculate the chances of a positive thing happening
set_variable = {
name = synergy_cultures_chance
value = 0.1
}
set_variable = {
name = synergy_cultures_amount
value = 0
}
var:mend_the_fracture_oath_target_culture = {
if = {
limit = {
cultural_acceptance = {
target = root.culture
value >= 99
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.4
}
}
}
else_if = {
limit = {
cultural_acceptance = {
target = root.culture
value >= 80
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.3
}
}
}
else_if = {
limit = {
cultural_acceptance = {
target = root.culture
value >= 60
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.2
}
}
}
else_if = {
limit = {
cultural_acceptance = {
target = root.culture
value >= 40
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.1
}
}
}
if = {
limit = {
culture_head ?= {
opinion = {
target = root
value >= 80
}
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.3
}
}
}
else_if = {
limit = {
culture_head ?= {
opinion = {
target = root
value >= 40
}
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.2
}
}
}
else_if = {
limit = {
culture_head ?= {
opinion = {
target = root
value >= 20
}
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.1
}
}
}
}
if = {
limit = {
exists = var:mend_the_fracture_oath_target_culture.culture_head
}
if = {
limit = {
opinion = {
target = var:mend_the_fracture_oath_target_culture.culture_head
value >= 80
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.3
}
}
}
else_if = {
limit = {
opinion = {
target = var:mend_the_fracture_oath_target_culture.culture_head
value >= 40
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.2
}
}
}
else_if = {
limit = {
opinion = {
target = var:mend_the_fracture_oath_target_culture.culture_head
value >= 20
}
}
root = {
change_variable = {
name = synergy_cultures_chance
add = 0.1
}
}
}
}
if = {
limit = {
prestige_level = 5
}
change_variable = {
name = synergy_cultures_chance
add = 0.2
}
}
else_if = {
limit = {
prestige_level = 4
}
change_variable = {
name = synergy_cultures_chance
add = 0.15
}
}
else_if = {
limit = {
prestige_level = 3
}
change_variable = {
name = synergy_cultures_chance
add = 0.1
}
}
else_if = {
limit = {
prestige_level = 2
}
change_variable = {
name = synergy_cultures_chance
add = 0.05
}
}
else_if = {
limit = {
prestige_level = 1
}
change_variable = {
name = synergy_cultures_chance
add = 0.02
}
}
if = {
limit = {
var:synergy_cultures_chance >= 1
}
change_variable = {
name = synergy_cultures_amount
add = var:synergy_cultures_chance
multiply = 2
}
set_variable = {
name = synergy_cultures_chance
value = 1
}
}
# calculate the amount of a positive things happening
var:mend_the_fracture_oath_target_culture = {
every_culture_county = {
limit = {
top_liege = root.top_liege
}
change_variable = {
name = synergy_cultures_amount
add = 1
}
}
}
change_variable = {
name = synergy_cultures_amount
multiply = 0.2
multiply = var:synergy_cultures_chance
min = 1
}
while = {
limit = {
var:synergy_cultures_amount > 0
}
random_list = {
1 = {
culture ?= {
random_culture_county = {
limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
holder = root
}
alternative_limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
top_liege = root.top_liege
}
alternative_limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
}
add_county_modifier = {
modifier = oath_mend_the_fracture_county
years = 2
}
add_to_list = synergy_culture_counties
}
}
var:mend_the_fracture_oath_target_culture = {
random_culture_county = {
limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
holder = root
}
alternative_limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
top_liege = root.top_liege
}
alternative_limit = {
NOT = {
has_county_modifier = oath_mend_the_fracture_county
}
}
add_county_modifier = {
modifier = oath_mend_the_fracture_county
years = 3
}
add_to_list = synergy_culture_counties
}
}
save_scope_as = county_reward
}
1 = {
modifier = {
NOT = {
root.culture.culture_head ?= root
}
factor = 0
}
spawn_army = {
name = ach_culture_synergy_troops
men_at_arms = {
type = accolade_maa_archers
stacks = 1
}
men_at_arms = {
type = accolade_maa_skirmishers
stacks = 1
}
location = root.capital_province
uses_supply = no
inheritable = yes
}
var:mend_the_fracture_oath_target_culture = {
if = {
limit = {
NOT = {
culture_head ?= root
}
}
}
culture_head ?= {
spawn_army = {
name = ach_culture_synergy_troops
men_at_arms = {
type = accolade_maa_skirmishers
stacks = 1
}
location = root.capital_province
uses_supply = no
inheritable = yes
}
}
}
save_scope_as = army_reward
}
1 = {
modifier = {
NOT = {
root.culture.culture_head ?= root
var:mend_the_fracture_oath_target_culture.culture_head != root
}
factor = 0
}
modifier = {
opinion = {
target = var:mend_the_fracture_oath_target_culture.culture_head
value = 100
}
factor = 0
}
add_opinion = {
target = var:mend_the_fracture_oath_target_culture.culture_head
opinion = 20
modifier = ach_synergy_culture_opinion
}
save_scope_as = opinion_reward
}
}
change_variable = {
name = synergy_cultures_amount
subtract = 1
}
}
# inform the player about what happened
send_interface_message = {
title = ach_maintenance_events.0002.title
if = {
limit = {
exists = scope:army_reward
}
custom_tooltip = ach_maintenance_events.0002.army_reward
}
if = {
limit = {
exists = scope:opinion_reward
}
custom_tooltip = ach_maintenance_events.0002.opinion_reward
}
if = {
limit = {
exists = scope:county_reward
}
every_in_list = {
list = synergy_culture_counties
show_as_tooltip = {
add_county_modifier = {
modifier = oath_mend_the_fracture_county
years = 2
}
}
}
}
}
if = {
limit = {
var:mend_the_fracture_oath_target_culture = {
any_culture_county = {
holder = {
culture = var:mend_the_fracture_oath_target_culture
is_ai = no
}
}
}
}
send_interface_message = {
title = ach_maintenance_events.0002.title
if = {
limit = {
exists = scope:army_reward
}
custom_tooltip = ach_maintenance_events.0002.army_reward
}
if = {
limit = {
exists = scope:opinion_reward
}
custom_tooltip = ach_maintenance_events.0002.opinion_reward
}
if = {
limit = {
exists = scope:county_reward
}
every_in_list = {
list = synergy_culture_counties
show_as_tooltip = {
add_county_modifier = {
modifier = oath_mend_the_fracture_county
years = 2
}
}
}
}
}
}
remove_variable = synergy_cultures_chance
remove_variable = synergy_cultures_amount
}
}
ach_maintenance_events.0100 = { #Coronation host is ded, notify guests
type = character_event
title = ach_maintenance_events.0100.t
desc = ach_maintenance_events.0100.desc
theme = realm
left_portrait = {
character = root
animation = shock
}
right_portrait = {
character = scope:host
animation = dead
}
immediate = {
}
option = {
name = ach_maintenance_events.0100.a
}
}
ach_maintenance_events.0101 = { #Coronation host has been imprisoned, notify guests
type = character_event
title = ach_maintenance_events.0101.t
desc = ach_maintenance_events.0101.desc
theme = realm
left_portrait = {
character = root
animation = shock
}
right_portrait = {
character = scope:host
animation = prisonhouse
}
lower_left_portrait = {
character = scope:gaoler
}
immediate = {
scope:host.imprisoner = {
save_scope_as = gaoler
}
}
trigger = {
NOT = { #you know what you did
this = scope:host.imprisoner
}
}
option = {
name = ach_maintenance_events.0101.a
}
}
ach_maintenance_events.0102 = { #Coronation host has been imprisoned, notify host and cancellation
type = character_event
title = ach_maintenance_events.0102.t
desc = ach_maintenance_events.0102.desc
theme = realm
left_portrait = {
character = root
animation = prisonhouse
}
right_portrait = {
character = scope:gaoler
animation = manic
}
immediate = {
scope:host.imprisoner = {
save_scope_as = gaoler
}
}
option = {
name = ach_maintenance_events.0102.a
}
}
ach_maintenance_events.0103 = { #No one shows up, notify host
type = character_event
title = ach_maintenance_events.0103.t
desc = ach_maintenance_events.0103.desc
theme = realm
left_portrait = {
character = root
animation = worry
}
immediate = {
}
option = {
name = ach_maintenance_events.0103.a
}
}
ach_maintenance_events.0104 = { #Officiator ded, host cancelled the coronation, notify guests
type = character_event
title = ach_maintenance_events.0104.t
desc = ach_maintenance_events.0104.desc
theme = realm
left_portrait = {
character = root
animation = stunned
}
right_portrait = {
character = scope:host
animation = wailing
}
lower_right_portrait = {
character = scope:dead_officiator
}
immediate = {
scope:activity.var:officiator ?= { save_scope_as = dead_officiator }
}
option = {
name = ach_maintenance_events.0104.a
}
}
ach_maintenance_events.0105 = { #Host excommunicated, notify guests
type = character_event
title = ach_maintenance_events.0105.t
desc = ach_maintenance_events.0105.desc
theme = realm
left_portrait = {
character = root
animation = worry
}
center_portrait = {
character = scope:host
animation = shame
}
right_portrait = {
character = scope:hof
animation = go_to_your_room
}
immediate = {
faith.religious_head = { save_scope_as = hof }
}
option = {
name = ach_maintenance_events.0105.a
}
}
ach_maintenance_events.0106 = { #Host excommunicated, notify host
type = character_event
title = ach_maintenance_events.0106.t
desc = ach_maintenance_events.0106.desc
theme = realm
left_portrait = {
character = root
animation = shame
}
right_portrait = {
character = scope:hof
animation = go_to_your_room
}
immediate = {
faith.religious_head = { save_scope_as = hof }
}
option = {
name = ach_maintenance_events.0106.a
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,210 @@
namespace = bp3_court_position
# Court Brewmaster upkeep event
bp3_court_position.100 = {
type = character_event
hidden = yes
trigger = {
NOT = { has_variable = experimental_brew_cooldown }
exists = court_position:court_brewmaster_court_position
has_variable = active_experimental_brew
}
immediate = {
# Set a cooldown, so it can only happen once every 6 months
set_variable = {
name = experimental_brew_cooldown
days = 179
}
set_variable = {
name = experimental_brew_creator
value = court_position:court_brewmaster_court_position
}
# Find what kind of drink it is (see 00_court_position_modifiers for a list of modifiers)
random_list = {
3 = { # Negative Drinks
add_character_flag = experimental_brew_negative
}
1 = { # Childish Drinks
trigger = {
any_child = {
count >= 1
is_adult = no
age >= 6
}
}
add_character_flag = experimental_brew_childish
random_child = {
limit = {
is_adult = no
age >= 6
}
root = {
set_variable = {
name = experimental_brew_child
value = prev
}
}
}
}
10 = { # Positive Drinks
add_character_flag = experimental_brew_positive
}
3 = { # Very Positive Drinks
add_character_flag = experimental_brew_very_positive
}
}
# Assign modifier and name
switch = {
trigger = has_character_flag
experimental_brew_negative = {
random_list = {
1 = { # Health
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = small_health_negative
}
}
1 = { # Courtier and Guest Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = court_guest_opinion_negative
}
}
1 = { # Negative Prestige
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = prestige_negative
}
}
1 = { # Negative Piety
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = piety_negative
}
}
}
}
experimental_brew_childish = {
# Child Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = child_opinion
}
}
experimental_brew_positive = {
random_list = {
1 = { # Diplomacy
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = diplomacy
}
}
1 = { # Martial
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = martial
}
}
1 = { # Stewardship
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = stewardship
}
}
1 = { # Intrigue
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = intrigue
}
}
1 = { # Learning
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = learning
}
}
1 = { # Prowess
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = prowess
}
}
1 = { # Courtier and Guest Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = court_guest_opinion_positive
}
}
1 = { # Courtly Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = courtly_opinion
}
}
1 = { # Prestige
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = prestige_positive
}
}
1 = { # Piety
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = piety_positive
}
}
1 = { # Attraction Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = attraction_opinion
}
}
1 = { # Fertility
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = fertility
}
}
}
}
experimental_brew_very_positive = {
random_list = {
1 = { # General Opinion
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = general_opinion
}
}
1 = { # Stress Loss
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = stress_loss
}
}
1 = { # Renown
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = renown
}
}
1 = { # Fascination
trigger = {
root.culture.culture_head = root
}
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = fascination
}
}
1 = { # Monthly Income
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = monthly_income
}
}
1 = { # Health
court_brewmaster_assign_modifier_positive_effect = {
MODIFIER = small_health_positive
}
}
}
}
}
### Clean up
remove_character_flag = experimental_brew_negative
remove_character_flag = experimental_brew_childish
remove_character_flag = experimental_brew_positive
remove_character_flag = experimental_brew_very_positive
remove_variable = experimental_brew_child
remove_variable = experimental_brew_creator
trigger_event = {
id = bp3_court_position.100
months = 6
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,951 @@
namespace = epidemic_events
epidemic_events.2001 = { #defender trying to status quo the vassal war cuz he's sick
type = character_event
title = epidemic_events.2001.t
desc = epidemic_events.2001.desc
theme = plague
left_portrait = {
character = root
animation = thinking
}
right_portrait = {
character = scope:pleading_vassal
animation = beg
}
lower_right_portrait = {
character = scope:attacking_vassal
}
override_background = {
reference = army_camp
}
override_effect_2d = {
reference = fog
}
cooldown = { years = 30 }
trigger = {
is_available_adult = yes
any_vassal = {
is_ai = yes
is_at_war = yes
any_character_war = {
primary_attacker = {
is_vassal_of = root
is_ai = yes
}
is_defender = prev
attacker_war_score > 30
}
realm_has_any_epidemic = { SIZE = 3 INTENSITY = minor }
current_gold_value > minor_gold_value
}
}
immediate = {
random_vassal = {
limit = {
is_ai = yes
is_at_war = yes
any_character_war = {
primary_attacker = {
is_vassal_of = root
is_ai = yes
}
is_defender = prev
attacker_war_score > 30
}
realm_has_any_epidemic = { SIZE = 2 INTENSITY = minor }
current_gold_value > minor_gold_value
}
save_scope_as = pleading_vassal
get_random_realm_epidemic = { INTENSITY = minor }
random_character_war = {
limit = {
primary_attacker = {
is_vassal_of = root
is_ai = yes
}
is_defender = prev
attacker_war_score > 30
}
save_scope_as = vassal_war
}
}
scope:vassal_war = {
primary_attacker = {
save_scope_as = attacking_vassal
}
}
set_variable = {
name = gold_transfer_value
value = scope:pleading_vassal.current_gold_value
}
scope:pleading_vassal = {
pay_short_term_gold = {
target = root
gold = current_gold_value
}
hidden_effect = {
if = {
limit = {
NOT = { has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait }
}
random = {
chance = 25
infect_with_epidemic = scope:epidemic_scope
}
}
}
}
}
option = { #send a royal order for white peace
name = epidemic_events.2001.c
duel = {
skill = diplomacy
target = scope:attacking_vassal
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 1
}
send_interface_toast = {
title = epidemic_events.2001.c.success
left_icon = scope:pleading_vassal
right_icon = scope:attacking_vassal
scope:vassal_war = {
end_war = white_peace
}
add_legitimacy_effect = { LEGITIMACY = minor_legitimacy_gain }
scope:pleading_vassal = {
add_opinion = {
modifier = thankful_opinion
opinion = 30
target = root
}
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -1
}
send_interface_toast = {
title = epidemic_events.2001.c.failure
left_icon = scope:pleading_vassal
right_icon = scope:attacking_vassal
scope:pleading_vassal = {
add_opinion = {
modifier = disappointed_opinion
opinion = -25
target = root
}
}
custom_tooltip = epidemic_events.2001.danger
}
hidden_effect = {
random = {
chance = 10
trigger_event = {
months = 4
id = epidemic_events.2002
}
}
}
}
}
stress_impact = {
greedy = medium_stress_gain
compassionate = medium_stress_loss
just = medium_stress_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_compassion = low_chance_impact_positive_ai_value
ai_rationality = low_chance_impact_positive_ai_value
}
}
}
option = { #imprison the other guy from traveling to you during a pandemic and wash whatever he touched
name = epidemic_events.2001.b
flavor = epidemic_events.2001.b.desc
imprison = {
target = scope:pleading_vassal
type = dungeon
}
scope:pleading_vassal = {
add_opinion = {
modifier = angry_opinion
opinion = -40
target = root
}
}
custom_tooltip = epidemic_events.2001.danger
hidden_effect = {
random = {
chance = 10
trigger_event = {
months = 4
id = epidemic_events.2002
}
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_greed = low_chance_impact_positive_ai_value
ai_rationality = low_chance_impact_positive_ai_value
}
}
stress_impact = {
compassionate = medium_stress_gain
just = medium_stress_gain
paranoid = major_stress_loss
}
}
option = { #pay money to end war
name = epidemic_events.2001.a
scope:vassal_war = {
end_war = white_peace
}
pay_treasury_or_gold = {
target = scope:attacking_vassal
value = {
value = root.var:gold_transfer_value
multiply = 0.5
}
}
scope:pleading_vassal = {
add_opinion = {
modifier = thankful_opinion
opinion = 30
target = root
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_greed = low_chance_impact_negative_ai_value
ai_compassion = low_chance_impact_positive_ai_value
}
}
stress_impact = {
greedy = medium_stress_gain
compassionate = medium_stress_loss
}
}
after = {
hidden_effect = {
if = {
limit = {
scope:pleading_vassal = {
has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait
is_imprisoned = no
}
}
random_list = {
60 = {
random_courtier = {
limit = {
NOT = { has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait }
}
save_scope_as = infected_courtier
}
send_interface_toast = {
title = epidemic_events.2001.epidemic_spread.t
left_icon = scope:pleading_vassal
right_icon = scope:infected_courtier
scope:infected_courtier = {
infect_with_epidemic = scope:epidemic_scope
}
}
}
20 = {
if = {
limit = {
NOT = { has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait }
}
}
random_courtier = {
limit = {
NOT = { has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait }
}
save_scope_as = first_infected_courtier
}
random_courtier = {
limit = {
NOT = {
has_trait = scope:epidemic_scope.epidemic_type.epidemic_trait
scope:first_infected_courtier = this
}
}
save_scope_as = second_infected_courtier
}
send_interface_toast = {
title = epidemic_events.2001.epidemic_spread.t
left_icon = scope:second_infected_courtier
right_icon = scope:first_infected_courtier
scope:first_infected_courtier = {
infect_with_epidemic = scope:epidemic_scope
}
scope:second_infected_courtier = {
infect_with_epidemic = scope:epidemic_scope
}
}
}
}
}
}
}
}
epidemic_events.2002 = {
type = character_event
title = epidemic_events.2002.t
desc = epidemic_events.2002.desc
theme = plague
left_portrait = {
character = root
animation = stress
}
lower_left_portrait = scope:attacking_vassal
lower_right_portrait = scope:pleading_vassal
trigger = {
exists = scope:epidemic_scope
exists = scope:vassal_war
is_ai = no
}
override_background = {
reference = battlefield
}
override_effect_2d = {
reference = fog
}
immediate = {
if = {
limit = {
scope:epidemic_scope = {
outbreak_intensity = minor
}
}
scope:epidemic_scope = {
set_epidemic_outbreak_intensity = major
}
}
else = {
scope:epidemic_scope = {
set_epidemic_outbreak_intensity = apocalyptic
}
}
add_legitimacy = miniscule_legitimacy_loss
}
option = {
name = epidemic_events.2002.a
stress_impact = {
base = minor_stress_gain
}
}
}
epidemic_events.2003 = { #maa are dying from war
type = character_event
title = epidemic_events.2003.t
desc = epidemic_events.2003.desc
theme = plague
left_portrait = {
character = root
animation = stress
}
right_portrait = {
character = scope:marshal
animation = marshal_shield
}
override_background = {
reference = army_camp
}
override_effect_2d = {
reference = flies
}
cooldown = { years = 8 }
trigger = {
is_available_adult = yes
any_held_county = {
any_county_province = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
save_temporary_scope_as = first_county
}
any_held_county = {
this != scope:first_county
any_county_province = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
}
exists = cp:councillor_marshal
}
immediate = {
random_held_county = {
limit = {
any_county_province = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
}
random_county_province = {
limit = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
save_scope_as = first_epidemic_province
random_province_epidemic = {
save_scope_as = epidemic_scope
}
}
save_scope_as = first_epidemic_county
}
random_held_county = {
limit = {
this != scope:first_epidemic_county
any_county_province = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
}
random_county_province = {
limit = {
has_stationed_regiment = yes
any_province_epidemic = {
intensity >= minor
}
}
save_scope_as = second_epidemic_province
}
}
cp:councillor_marshal = { save_scope_as = marshal }
}
option = { #pay more to get more recruits
name = epidemic_events.2003.a
every_maa_regiment = {
change_maa_troops_count = {
value = {
value = this.maa_current_troops_count
multiply = -0.25
}
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_greed = low_chance_impact_negative_ai_value
ai_rationality = low_chance_impact_positive_ai_value
}
}
stress_impact = {
greedy = medium_stress_gain
ambitious = medium_stress_loss
}
}
option = { #dont care, press peasants as maa
name = epidemic_events.2003.b
scope:first_epidemic_province = {
add_province_modifier = {
modifier = epidemic_pressed_levies
years = 5
}
}
scope:second_epidemic_province = {
add_province_modifier = {
modifier = epidemic_pressed_levies
years = 5
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_greed = low_chance_impact_positive_ai_value
ai_compassion = low_chance_impact_negative_ai_value
ai_rationality = low_chance_impact_positive_ai_value
}
}
stress_impact = {
just = medium_stress_gain
}
}
option = { #close the barracks!
name = epidemic_events.2003.c
scope:first_epidemic_province = {
add_province_modifier = {
modifier = epidemic_closed_barracks
years = 5
}
}
scope:second_epidemic_province = {
add_province_modifier = {
modifier = epidemic_closed_barracks
years = 5
}
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_compassion = low_chance_impact_positive_ai_value
ai_rationality = low_chance_impact_positive_ai_value
}
}
stress_impact = {
paranoid = medium_stress_loss
}
}
}
epidemic_events.2004 = { #Medicinal Jar creation event
hidden = yes
trigger = {
is_available_adult = yes
court_position:court_physician_court_position ?= {
is_available_ai_adult = yes
culture != root.culture
NOT = {
has_character_flag = physician_medicinal_jar
}
}
realm_has_any_nearby_epidemic = { SIZE = 4 INTENSITY = minor }
}
cooldown = { years = 160 }
immediate = {
court_position:court_physician_court_position = {
save_scope_as = physician
}
scope:physician = {
create_artifact = {
name = medicine_jar
description = medicine_jar_desc
type = miscellaneous
visuals = glazed_jar
modifier = artifact_epidemic_resistance_1_modifier
modifier = artifact_learning_lifestyle_xp_2_modifier
save_scope_as = medicine_jar
quality = 50
}
add_character_flag = physician_medicinal_jar
}
if = {
limit = {
scope:physician = {
can_equip_artifact = scope:medicine_jar
}
}
scope:medicine_jar = {
equip_artifact_to_owner = yes
}
get_random_nearby_realm_epidemic = { INTENSITY = minor }
trigger_event = {
days = { 3 7 }
id = epidemic_events.2005
}
}
}
}
epidemic_events.2005 = { #Glass jar artifact
type = character_event
title = epidemic_events.2005.t
desc = epidemic_events.2005.desc
theme = plague
left_portrait = {
character = root
animation = personality_rational
}
right_portrait = {
character = scope:physician
animation = physician
}
artifact = {
target = scope:medicine_jar
position = lower_center_portrait
}
override_background = {
reference = physicians_study
}
trigger = {
scope:physician = { is_alive = yes }
}
option = { #politely ask the physisican to part with the jar
name = epidemic_events.2005.a
duel = {
skill = diplomacy
target = scope:physician
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 1
}
send_interface_toast = {
title = epidemic_events.2005.a.success
left_icon = scope:physician
scope:medicine_jar = {
set_owner = root
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -1
}
send_interface_toast = {
title = epidemic_events.2005.a.failure
left_icon = scope:physician
scope:medicine_jar = {
add_artifact_modifier = artifact_physician_aptitude_1_modifier
}
}
}
}
stress_impact = {
craven = minor_stress_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = low_chance_impact_negative_ai_value
}
}
}
option = { #violently grab the jar from physician
name = epidemic_events.2005.b
scope:physician = {
add_opinion = {
modifier = fp3_stole_from_me
opinion = -25
target = root
}
progress_towards_rival_effect = {
REASON = rival_stole_artifact
CHARACTER = root
OPINION = 0
}
}
scope:medicine_jar = {
set_owner = root
}
stress_impact = {
temperate = medium_stress_gain
just = medium_stress_gain
paranoid = medium_stress_loss
wrathful = medium_stress_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_greed = low_chance_impact_positive_ai_value
ai_energy = low_chance_impact_positive_ai_value
ai_rationality = low_chance_impact_negative_ai_value
}
}
}
option = { #let phycisian keep his precious jar
name = epidemic_events.2005.c
scope:medicine_jar = {
add_artifact_modifier = artifact_physician_aptitude_1_modifier
}
stress_impact = {
temperate = medium_stress_loss
just = medium_stress_loss
trusting = medium_stress_loss
}
ai_chance = {
base = 10
ai_value_modifier = {
ai_compassion = low_chance_impact_positive_ai_value
ai_rationality = low_chance_impact_positive_ai_value
ai_greed = low_chance_impact_negative_ai_value
}
}
}
}
epidemic_events.2006 = { #Dancing plague
type = character_event
title = epidemic_events.2006.t
desc = epidemic_events.2006.desc
theme = plague
override_background = courtyard
override_effect_2d = { reference = flies }
left_portrait = {
character = root
animation = stress
}
right_portrait = {
character = scope:dance_victim
animation = dancing_plague
}
trigger = {
is_available_adult = yes
OR = {
is_ai = no
this = top_liege
}
capital_province = {
any_province_epidemic = {
#epidemic_type = epidemic_type:ergotism
intensity < apocalyptic
}
}
NOT = {
has_character_flag = had_event_dancing_plague
}
}
weight_multiplier = {
base = 1
modifier = { #Since a big outbreak occurred in Aachen 1374
add = 9
capital_province = {
county = title:c_aachen
}
current_date >= 1370.1.1
current_date <= 1380.1.1
}
modifier = { #Since an outbreak occurred in Erfurt 1247
add = 9
capital_province = {
duchy = title:d_thuringia
}
current_date >= 1240.1.1
current_date <= 1250.1.1
}
modifier = { #Since an outbreak occurred in Kolbigk 1021
add = 9
capital_province = {
geographical_region = ghw_region_saxony
}
current_date >= 1020.1.1
current_date <= 1030.1.1
}
modifier = { #Since it historically occurred in Europe
add = 1
capital_province = {
geographical_region = world_europe
}
}
}
immediate = {
capital_province = {
random_province_epidemic = {
limit = {
epidemic_type = epidemic_type:ergotism
outbreak_intensity < apocalyptic
}
save_scope_as = dancing_plague
}
}
create_character = {
template = servant_character
dynasty = none
location = root.capital_province
save_scope_as = dance_victim
}
hidden_effect = {
scope:dance_victim = {
add_trait = ergotism
}
}
scope:dancing_plague = {
set_epidemic_outbreak_intensity = apocalyptic
}
add_character_flag = had_event_dancing_plague
}
option = { #let's join the paaartey
trigger = {
has_trait = eccentric
}
name = epidemic_events.2006.a
add_character_modifier = {
modifier = ce1_gone_dancing
years = 2
}
hidden_effect = {
random = {
chance = 10
trigger_event = { id = health.1017 days = { 5 15 } } #You contract ergotism
}
}
stress_impact = {
eccentric = medium_stress_loss
}
ai_chance = {
base = 100
}
}
option = { #slay the demon!
trigger = {
has_trait = zealous
}
name = epidemic_events.2006.d
add_piety = minor_piety_gain
scope:dance_victim = {
death = {
death_reason = death_murder
killer = root
}
}
stress_impact = {
zealous = medium_stress_loss
}
ai_chance = {
base = 10
ai_value_modifier = {
ai_compassion = low_chance_impact_negative_ai_value
ai_zeal = low_chance_impact_positive_ai_value
}
}
}
option = { #eh, every dance stops eventually, right?
name = epidemic_events.2006.b
capital_county = {
add_county_modifier = {
modifier = dance_plague_modifier
years = 4
}
}
stress_impact = {
compassionate = minor_stress_gain
}
ai_chance = {
base = 10
ai_value_modifier = {
ai_compassion = low_chance_impact_negative_ai_value
}
}
}
option = { #tie them down! allieviate their pains somehow
name = epidemic_events.2006.c
hidden_effect = {
random = {
chance = 10
trigger_event = { id = health.1017 days = { 5 15 } } #You contract ergotism
}
}
stress_impact = {
lustful = medium_stress_loss
compassionate = medium_stress_loss
}
ai_chance = {
base = 10
ai_value_modifier = {
ai_compassion = low_chance_impact_positive_ai_value
}
}
}
}

View file

@ -0,0 +1,134 @@
namespace = story_event_legends
###################################
# Legend Ending Events
# 0001 - 0100
###################################
#Heroic Ending Story Event
story_event_legends.0001 = {
type = character_event
window = fullscreen_event
title = story_event_legends.0001.t
desc = {
desc = story_event_legends.0001.desc.intro
first_valid = {
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = famous_deed }
}
desc = story_event_legends.0001.desc.famous_deed
}
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = battle }
}
desc = story_event_legends.0001.desc.battle
}
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = hunt }
}
desc = story_event_legends.0001.desc.hunt
}
desc = story_event_legends.0001.desc.fallback
}
desc = story_event_legends.0001.desc.outro
}
theme = legend
override_background = { reference = ce1_fullscreen_heroic_legend }
override_sound = { reference = "event:/DLC/FP4/SFX/UI/Unique/sfx_ui_spread_legend" }
immediate = {
play_music_cue = mx_cue_legend
set_variable = {
name = finished_legend_var
value = scope:promoted_legend
}
scope:promoted_legend = { set_variable = my_legend_var }
}
option = {
name = story_event_legends.0001.a
clicksound = "event:/DLC/FP2/SFX/UI/fp2_struggle_start_select"
}
}
#Legitimizing Ending Story Event
story_event_legends.0002 = {
type = character_event
window = fullscreen_event
title = story_event_legends.0002.t
desc = {
desc = story_event_legends.0002.desc.intro
first_valid = {
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = famous_deed }
}
desc = story_event_legends.0002.desc.famous_deed
}
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = battle }
}
desc = story_event_legends.0002.desc.battle
}
desc = story_event_legends.0002.desc.fallback
}
desc = story_event_legends.0002.desc.outro
}
theme = legend
override_background = { reference = ce1_fullscreen_legitimizing_legend }
override_sound = { reference = "event:/DLC/FP4/SFX/UI/Unique/sfx_ui_spread_legend" }
immediate = {
play_music_cue = mx_cue_legend
set_variable = {
name = finished_legend_var
value = scope:promoted_legend
}
scope:promoted_legend = { set_variable = my_legend_var }
}
option = {
name = story_event_legends.0002.a
clicksound = "event:/DLC/FP2/SFX/UI/fp2_struggle_start_select"
}
}
#Holy Ending Story Event
story_event_legends.0003 = {
type = character_event
window = fullscreen_event
title = story_event_legends.0003.t
desc = {
desc = story_event_legends.0003.desc.intro
first_valid = {
triggered_desc = {
trigger = {
scope:promoted_legend = { has_legend_chapter = famous_deed }
}
desc = story_event_legends.0001.desc.famous_deed
}
desc = story_event_legends.0001.desc.fallback
}
desc = story_event_legends.0003.desc.outro
}
theme = legend
override_background = { reference = ce1_fullscreen_holy_legend }
override_sound = { reference = "event:/DLC/FP4/SFX/UI/Unique/sfx_ui_spread_legend" }
immediate = {
play_music_cue = mx_cue_legend
set_variable = {
name = finished_legend_var
value = scope:promoted_legend
}
scope:promoted_legend = { set_variable = my_legend_var }
}
option = {
name = story_event_legends.0003.a
clicksound = "event:/DLC/FP2/SFX/UI/fp2_struggle_start_select"
}
}

View file

@ -0,0 +1,790 @@
namespace = legend_events
############################
## Legend Spawn Events
## 0001-1000
## by James Beaumont
############################
# legend_events.0001 - Chronicler gives you a legend seed
# legend_events.0010 - Chronicler convinces someone to promote your legend
# legend_events.0020 - Hold Court presentation of a legend seed
# Chronicler gives you a legend seed :D
legend_events.0001 = {
type = character_event
title = legend_events.0001.t
desc = {
desc = legend_events.0001.desc.intro
first_valid = {
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:slew_dragon
}
desc = legend_events.0001.desc.mid.slew_dragon
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:ancestral_saint
}
desc = legend_events.0001.desc.mid.ancestral_saint
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:old_godly_descent
}
desc = legend_events.0001.desc.mid.old_godly_descent
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:raised_by_animals
}
desc = legend_events.0001.desc.mid.raised_by_animals
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:auspicious_stars
}
desc = legend_events.0001.desc.mid.auspicious_stars
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:virgin_birth
}
desc = legend_events.0001.desc.mid.virgin_birth
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:spoke_to_angels
}
desc = legend_events.0001.desc.mid.spoke_to_angels
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:fought_the_devil
}
desc = legend_events.0001.desc.mid.fought_the_devil
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:exotic_backstory
}
desc = legend_events.0001.desc.mid.exotic_backstory
}
triggered_desc = {
trigger = {
var:legend_seed_to_give = flag:ancient_people
}
desc = legend_events.0001.desc.mid.ancient_people
}
}
desc = legend_events.0001.desc.outro
}
theme = legend
left_portrait = {
character = root
animation = personality_honorable
}
right_portrait = {
character = scope:chronicler
animation = chancellor
}
lower_center_portrait = {
trigger = {
exists = scope:legend_character
}
character = scope:legend_character
}
# The Court Chronicler needs to be alive
trigger = {
scope:chronicler = {
is_alive = yes
}
}
immediate = {
random_list = { # Determine the seed to hand out
10 = { # Ancestor killed a dragon
trigger = {
any_ancestor = {
even_if_dead = yes
is_adult = yes
is_alive = no
}
NOT = { has_game_rule = historical_legends_only }
}
random_ancestor = {
even_if_dead = yes
limit = {
is_adult = yes
is_alive = no
}
weight = {
base = 1
modifier = {
add = prowess
}
modifier = {
add = martial
}
}
save_scope_as = legend_character
}
set_variable = {
name = legend_seed_to_give
value = flag:slew_dragon
}
}
10 = { # Ancestor was/should be a saint
trigger = {
any_ancestor = {
even_if_dead = yes
is_adult = yes
is_alive = no
}
NOT = { has_game_rule = historical_legends_only }
}
random_ancestor = {
even_if_dead = yes
limit = {
is_adult = yes
is_alive = no
}
weight = {
base = 1
modifier = {
add = learning
}
modifier = {
factor = 3
OR = {
num_virtuous_traits = {
target = root.faith
value >= 1
}
has_trait = saint
}
}
modifier = {
factor = 0.1
OR = {
num_sinful_traits = {
target = root.faith
value >= 1
}
has_trait = excommunicated
}
}
}
save_scope_as = legend_character
}
set_variable = {
name = legend_seed_to_give
value = flag:ancestral_saint
}
}
10 = { # I am descended from an old God
trigger = {
NOT = { religion = { is_in_family = rf_pagan } }
any_ancestor = {
even_if_dead = yes
is_alive = no
religion = { is_in_family = rf_pagan }
}
NOT = { has_game_rule = historical_legends_only }
}
random_ancestor = {
even_if_dead = yes
limit = {
religion = { is_in_family = rf_pagan }
is_alive = no
}
weight = {
base = 1
modifier = {
add = learning
}
modifier = {
factor = 3
OR = {
num_virtuous_traits = {
target = root.faith
value >= 1
}
has_trait = saint
}
}
modifier = {
factor = 0.1
OR = {
num_sinful_traits = {
target = root.faith
value >= 1
}
has_trait = excommunicated
}
}
}
save_scope_as = legend_character
}
set_variable = {
name = legend_seed_to_give
value = flag:old_godly_descent
}
}
10 = { # I was raised by dangerous animals
trigger = {
NOT = { has_game_rule = historical_legends_only }
}
select_local_animal_effect = { TYPE = dangerous }
set_variable = {
name = legend_seed_to_give
value = flag:raised_by_animals
}
}
10 = { # Born under auspicious stars
trigger = {
NOT = { has_game_rule = historical_legends_only }
}
set_variable = {
name = legend_seed_to_give
value = flag:auspicious_stars
}
}
10 = { # Virgin birth
trigger = {
has_any_bastard_trait_trigger = yes
NOT = { has_game_rule = historical_legends_only }
}
set_variable = {
name = legend_seed_to_give
value = flag:virgin_birth
}
}
10 = { # Spoke to an angel
trigger = {
religion_has_angels_trigger = yes
NOT = { has_game_rule = historical_legends_only }
}
set_variable = {
name = legend_seed_to_give
value = flag:spoke_to_angels
}
}
10 = { # Fought a demon
trigger = {
NOT = { has_game_rule = historical_legends_only }
}
set_variable = {
name = legend_seed_to_give
value = flag:fought_the_devil
}
}
10 = { # Exotic backstory
get_appropriate_exotic_location = yes
set_variable = {
name = legend_seed_to_give
value = flag:exotic_backstory
}
}
10 = { # Ancient people
trigger = {
# The ancient cultures we have for now aren't appropriate for these regions
root.culture = {
NOR = {
culture_overlaps_geographical_region = world_burma
culture_overlaps_geographical_region = custom_arakan_mountains
culture_overlaps_geographical_region = world_tibet
}
}
}
get_appropriate_ancient_people = yes
set_variable = {
name = legend_seed_to_give
value = flag:ancient_people
}
}
}
}
option = { # Wowie zowie, really?
name = legend_events.0001.a
if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:slew_dragon
}
create_legend_seed = {
type = heroic
quality = famed
chronicle = beast_slayer
properties = {
beast = flag:dragon
location = root.location
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:ancestral_saint
}
create_legend_seed = {
type = holy
quality = famed
chronicle = saintly_deed
properties = {
ancestor = scope:legend_character
religion = root.religion
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:old_godly_descent
}
generate_religion_descent_effect = {
RELIGION = scope:legend_character.religion
GOD = high_god
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:raised_by_animals
}
create_legend_seed = {
type = heroic
quality = famed
chronicle = raised_by_animals
properties = {
beast = var:animal_type
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:auspicious_stars
}
create_legend_seed = {
type = holy
quality = famed
chronicle = sacred_birth
properties = {
reason = flag:auspicious
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:virgin_birth
}
create_legend_seed = {
type = holy
quality = famed
chronicle = sacred_birth
properties = {
reason = flag:virgin
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:spoke_to_angels
}
create_legend_seed = {
type = holy
quality = famed
chronicle = divine_intervention
properties = {
god = flag:the_angels
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:fought_the_devil
}
create_legend_seed = {
type = holy
quality = famed
chronicle = fought_devil
properties = {
faith = root.faith
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:exotic_backstory
}
create_legend_seed = {
type = heroic
quality = famed
chronicle = exotic_backstory
properties = {
location = scope:exotic_location
}
}
}
else_if = {
limit = {
exists = var:legend_seed_to_give
var:legend_seed_to_give = flag:ancient_people
}
create_legend_seed = {
type = legitimizing
quality = famed
chronicle = ancient_people
properties = {
culture = scope:ancient_culture
title = root.primary_title
original_region = var:original_region
}
}
}
ai_chance = {
base = 100
}
}
option = { # I don't want this legend
name = legend_events.0001.b
ai_chance = {
base = 0
}
}
}
# Chronicler convinces someone to promote your legend
legend_events.0010 = {
type = character_event
title = legend_events.0010.t
desc = legend_events.0010.desc
theme = legend
left_portrait = {
character = root
animation = personality_honorable
}
center_portrait = {
character = scope:chronicler
animation = chancellor
}
right_portrait = {
character = scope:potential_promoter
animation = chancellor
}
option = { # Diplo duel option
name = legend_events.0010.a
duel = {
skill = diplomacy
target = scope:potential_promoter
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
modifier = { # Reluctant to drop their existing legend
scope:potential_promoter = { exists = promoted_legend }
factor = 0.5
}
send_interface_toast = {
title = legend_events.0010.a.success
scope:potential_promoter = {
set_promoted_legend = root.promoted_legend
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
modifier = { # Reluctant to drop their existing legend
scope:potential_promoter = { exists = promoted_legend }
factor = 2
}
send_interface_toast = {
title = legend_events.0010.a.failure
add_prestige = minor_prestige_loss
}
}
}
ai_chance = {
base = 100
modifier = { # I'd have better odds with option B
intrigue > diplomacy
factor = 0
}
}
}
option = { # Lie
name = legend_events.0010.b
duel = {
skill = intrigue
target = scope:potential_promoter
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
modifier = { # Reluctant to drop their existing legend
scope:potential_promoter = { exists = promoted_legend }
factor = 0.5
}
send_interface_toast = {
title = legend_events.0010.a.success
scope:potential_promoter = {
set_promoted_legend = root.promoted_legend
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
modifier = { # Reluctant to drop their existing legend
scope:potential_promoter = { exists = promoted_legend }
factor = 2
}
send_interface_toast = {
title = legend_events.0010.a.failure
add_prestige = minor_prestige_loss
}
}
}
stress_impact = {
honest = minor_stress_impact_gain
}
ai_chance = {
base = 100
modifier = { # I'd have better odds with option A
intrigue < diplomacy
factor = 0
}
}
}
option = { # Nah not interested, go away.
name = legend_events.0010.c
ai_chance = {
base = 0
}
}
}
legend_events.0020 = { #hold court presentation of a potential seed
type = court_event
title = legend_events.0020.t
desc = legend_events.0020.desc
theme = legend
court_scene = {
button_position_character = scope:seed_presenter
court_event_force_open = yes
show_timeout_info = no
should_pause_time = yes
roles = {
scope:seed_presenter = {
group = petitioners_group
animation = personality_rational
}
}
}
widget = {
gui = "event_window_widget_event_chain_progress"
container = "custom_widgets_container"
controller = event_chain_progress
}
weight_multiplier = {
base = 1
modifier = {
factor = 2
court_grandeur_current_level > court_grandeur_minimum_expected_level
}
# Court weightings.
ep1_weight_up_for_court_type_modifier = { COURT_TYPE = court_diplomatic }
}
trigger = {
any_pool_guest = {
count >= 1
is_available_adult = yes
has_court_event_flag = no
culture != root.culture
opinion = {
target = root
value >= high_positive_opinion
}
}
NOR = {
has_personal_legend_seed = heroic
has_personal_legend_seed = holy
has_personal_legend_seed = legitimizing
}
}
immediate = {
random_pool_guest = {
limit = {
is_available_adult = yes
has_court_event_flag = no
culture != root.culture
opinion = {
target = root
value >= high_positive_opinion
}
}
save_scope_as = seed_presenter
court_event_character_flag_effect = yes
}
hold_court_queue_next_event_effect = yes
}
option = { #yes, it is my about my dynasty and I shall prove it!
name = legend_events.0020.a
legend_seed_great_deed_dynasty_effect = yes
culture = {
change_cultural_acceptance = {
target = scope:seed_presenter.culture
value = miniscule_positive_culture_acceptance
desc = cultural_acceptance_gain_hold_court_event_outcome
}
}
stress_impact = {
ambitious = minor_stress_loss
}
ai_chance = { #we want AI to have seeds
base = 100
}
}
option = { #yes, it is about me ruling the title and I shall prove it!
name = legend_events.0020.b
legend_seed_great_deed_title_effect = {
TITLE = root.primary_title
}
culture = {
change_cultural_acceptance = {
target = scope:seed_presenter.culture
value = miniscule_positive_culture_acceptance
desc = cultural_acceptance_gain_hold_court_event_outcome
}
}
stress_impact = {
ambitious = minor_stress_loss
}
ai_chance = { #we want AI to have seeds
base = 100
}
}
option = { #no, I don't need to humor your culture fairy tales
name = legend_events.0020.c
add_prestige = medium_prestige_gain
dynasty = {
add_dynasty_prestige = minor_dynasty_prestige_gain
}
culture = {
change_cultural_acceptance = {
target = scope:seed_presenter.culture
value = low_negative_culture_acceptance
desc = cultural_acceptance_gain_hold_court_event_outcome
}
}
stress_impact = {
ambitious = minor_stress_gain
compassionate = minor_stress_gain
callous = medium_stress_loss
sadistic = medium_stress_loss
}
ai_chance = { #we want AI to have seeds
base = 0
}
}
after = {
scope:seed_presenter = {
clear_court_event_participation = yes
}
# Finish up the chain if relevant.
hold_court_queue_post_event_effect = yes
}
}
legend_events.1000 = {
type = letter_event
opening = { desc = legend_events.1000.t }
desc = legend_events.1000.desc
sender = scope:legend_owner
immediate = {
scope:legend = {
legend_owner = { save_scope_as = legend_owner }
}
}
option = { #I did a silly
name = legend_events.1000.a
pay_short_term_gold = {
target = scope:legend_owner
gold = medium_gold_value
}
stress_impact = {
deceitful = major_stress_impact_loss
honest = medium_stress_impact_gain
just = medium_stress_impact_gain
}
ai_chance = {
base = 100
}
}
option = { #If you have really high Intrigue you get away with paying just half
name = legend_events.1000.b
trigger = {
intrigue >= very_high_skill_rating
}
#trait = deceitful
pay_short_term_gold = {
target = scope:legend_owner
gold = {
value = medium_gold_value
multiply = 0.5
}
}
stress_impact = {
deceitful = massive_stress_impact_loss
honest = major_stress_impact_gain
just = medium_stress_impact_gain
}
ai_chance = {
base = 100
}
}
after = {
remove_variable = accepted_promote_legend_var
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,32 @@
namespace = legitimacy_events
############################
## Legitimacy Maintenance Events
## 0001-1000
## by Joe Parkin
############################
# legitimacy_events.0001 - Debug event for testing base legitimacy values with breakdowns of sources
legitimacy_events.0001 = {
type = character_event
title = LOREM_IPSUM_TITLE
desc = LOREM_IPSUM_DESCRIPTION
theme = realm
orphan = yes
left_portrait = root
trigger = {
exists = dynasty
# Exclude unplayable for now
NOR = {
government_has_flag = government_is_republic
government_has_flag = government_is_theocracy
}
}
option = {
add_legitimacy = base_legitimacy_value
custom_tooltip = base_legitimacy_debug_tt
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,719 @@
namespace = ep1_character_interaction
##################################################
#
# Character Interaction Events
#
# 0001 - 0010 Indebt Guest
##################################################
##################################################
# CHARACTER INTERACTION EVENTS
##################################################
# A Sensible Recompense
# by Ewan Cowhig Croft
# 0001 - 0010
##################################################
scripted_trigger ep1_character_interaction_0001_valid_hostile_relation_trigger = {
# Must be at a court of some kind *other* than your own.
exists = host
scope:actor != host
# And not in scope:actor's prison.
NOR = {
imprisoner ?= scope:actor
}
# Double check that this'd be an appropriate court to send a plant.
save_temporary_scope_as = current_target
scope:actor = {
OR = {
# Either you've got a scheme on the go...
any_scheme = {
hostile_scheme_trigger = yes
scheme_target_character = scope:current_target
}
# ... or you could start one.
can_start_hostile_scheme_against_trigger = { TARGET = scope:current_target}
}
}
}
scripted_trigger ep1_character_interaction_0001_valid_rival_trigger = {
ep1_character_interaction_0001_valid_hostile_relation_trigger = yes
OR = {
NOT = { exists = scope:actor_nemesis }
this != scope:actor_nemesis
}
}
scripted_effect ep1_character_interaction_0001_move_character_and_family_effect = {
scope:recipient = {
# Whatever else happens, just move them.
scope:actor = { remove_courtier_or_guest = scope:recipient }
$DESTINATION$ = { add_courtier = scope:recipient }
# If they have any family, quietly send them along too.
hidden_effect = {
if = {
limit = {
any_traveling_family_member = { }
}
every_traveling_family_member = {
save_temporary_scope_as = family_to_shunt
scope:actor = { remove_courtier_or_guest = scope:family_to_shunt }
$DESTINATION$ = { add_courtier = scope:family_to_shunt }
}
}
}
}
}
# Trick a guest into a debt & turn them into an agent.
ep1_character_interaction.0001 = {
type = character_event
title = ep1_character_interaction.0001.t
desc = {
desc = ep1_character_interaction.0001.desc.intro
first_valid = {
triggered_desc = {
trigger = { scope:false_flag_type = flag:lustful }
desc = ep1_character_interaction.0001.desc.lustful
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:chaste }
desc = ep1_character_interaction.0001.desc.chaste
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:gluttonous }
desc = ep1_character_interaction.0001.desc.gluttonous
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:temperate }
desc = ep1_character_interaction.0001.desc.temperate
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:greedy }
desc = ep1_character_interaction.0001.desc.greedy
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:generous }
desc = ep1_character_interaction.0001.desc.generous
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:lazy }
desc = ep1_character_interaction.0001.desc.lazy
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:diligent }
desc = ep1_character_interaction.0001.desc.diligent
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:wrathful }
desc = ep1_character_interaction.0001.desc.wrathful
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:calm }
desc = ep1_character_interaction.0001.desc.calm
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:patient }
desc = ep1_character_interaction.0001.desc.patient
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:impatient }
desc = ep1_character_interaction.0001.desc.impatient
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:arrogant }
desc = ep1_character_interaction.0001.desc.arrogant
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:humble }
desc = ep1_character_interaction.0001.desc.humble
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:deceitful }
desc = ep1_character_interaction.0001.desc.deceitful
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:honest }
desc = ep1_character_interaction.0001.desc.honest
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:craven }
desc = ep1_character_interaction.0001.desc.craven
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:brave }
desc = ep1_character_interaction.0001.desc.brave
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:shy }
desc = ep1_character_interaction.0001.desc.shy
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:gregarious }
desc = ep1_character_interaction.0001.desc.gregarious
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:ambitious }
desc = ep1_character_interaction.0001.desc.ambitious
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:content }
desc = ep1_character_interaction.0001.desc.content
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:arbitrary }
desc = ep1_character_interaction.0001.desc.arbitrary
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:just }
desc = ep1_character_interaction.0001.desc.just
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:cynical }
desc = ep1_character_interaction.0001.desc.cynical
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:zealous }
desc = ep1_character_interaction.0001.desc.zealous
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:paranoid }
desc = ep1_character_interaction.0001.desc.paranoid
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:trusting }
desc = ep1_character_interaction.0001.desc.trusting
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:compassionate }
desc = ep1_character_interaction.0001.desc.compassionate
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:callous }
desc = ep1_character_interaction.0001.desc.callous
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:sadistic }
desc = ep1_character_interaction.0001.desc.sadistic
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:stubborn }
desc = ep1_character_interaction.0001.desc.stubborn
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fickle }
desc = ep1_character_interaction.0001.desc.fickle
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:vengeful }
desc = ep1_character_interaction.0001.desc.vengeful
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:forgiving }
desc = ep1_character_interaction.0001.desc.forgiving
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fallback_1 }
desc = ep1_character_interaction.0001.desc.fallback_1
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fallback_2 }
desc = ep1_character_interaction.0001.desc.fallback_2
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fallback_3 }
desc = ep1_character_interaction.0001.desc.fallback_3
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fallback_4 }
desc = ep1_character_interaction.0001.desc.fallback_4
}
triggered_desc = {
trigger = { scope:false_flag_type = flag:fallback_5 }
desc = ep1_character_interaction.0001.desc.fallback_5
}
}
desc = ep1_character_interaction.0001.desc.outro
}
theme = intrigue_skulduggery_focus
left_portrait = {
character = scope:actor
animation = schadenfreude
}
right_portrait = {
character = scope:recipient
animation = fear
}
lower_center_portrait = scope:actor_nemesis
lower_right_portrait = scope:actor_rival
override_background = { reference = throne_room }
immediate = {
# Apply the interaction's effects.
indebt_guest_interaction_accepted_effect = yes
# Roll the offending crime.
## Percentages even throughout: we're not fussed about which result you roll.
scope:recipient = {
random_list = {
# lustful
100 = {
trigger = { has_trait = lustful }
save_scope_value_as = {
name = false_flag_type
value = flag:lustful
}
}
# chaste
100 = {
trigger = { has_trait = chaste }
save_scope_value_as = {
name = false_flag_type
value = flag:chaste
}
}
# gluttonous
100 = {
trigger = { has_trait = gluttonous }
save_scope_value_as = {
name = false_flag_type
value = flag:gluttonous
}
}
# temperate
100 = {
trigger = { has_trait = temperate }
save_scope_value_as = {
name = false_flag_type
value = flag:temperate
}
}
# greedy
100 = {
trigger = { has_trait = greedy }
save_scope_value_as = {
name = false_flag_type
value = flag:greedy
}
}
# generous
100 = {
trigger = { has_trait = generous }
save_scope_value_as = {
name = false_flag_type
value = flag:generous
}
}
# lazy
100 = {
trigger = { has_trait = lazy }
save_scope_value_as = {
name = false_flag_type
value = flag:lazy
}
}
# diligent
100 = {
trigger = { has_trait = diligent }
save_scope_value_as = {
name = false_flag_type
value = flag:diligent
}
}
# wrathful
100 = {
trigger = { has_trait = wrathful }
save_scope_value_as = {
name = false_flag_type
value = flag:wrathful
}
}
# calm
100 = {
trigger = { has_trait = calm }
save_scope_value_as = {
name = false_flag_type
value = flag:calm
}
}
# patient
100 = {
trigger = { has_trait = patient }
save_scope_value_as = {
name = false_flag_type
value = flag:patient
}
}
# impatient
100 = {
trigger = { has_trait = impatient }
save_scope_value_as = {
name = false_flag_type
value = flag:impatient
}
}
# arrogant
100 = {
trigger = { has_trait = arrogant }
save_scope_value_as = {
name = false_flag_type
value = flag:arrogant
}
}
# humble
100 = {
trigger = { has_trait = humble }
save_scope_value_as = {
name = false_flag_type
value = flag:humble
}
}
# deceitful
100 = {
trigger = { has_trait = deceitful }
save_scope_value_as = {
name = false_flag_type
value = flag:deceitful
}
}
# honest
100 = {
trigger = { has_trait = honest }
save_scope_value_as = {
name = false_flag_type
value = flag:honest
}
}
# craven
100 = {
trigger = { has_trait = craven }
save_scope_value_as = {
name = false_flag_type
value = flag:craven
}
}
# brave
100 = {
trigger = { has_trait = brave }
save_scope_value_as = {
name = false_flag_type
value = flag:brave
}
}
# shy
100 = {
trigger = { has_trait = shy }
save_scope_value_as = {
name = false_flag_type
value = flag:shy
}
}
# gregarious
100 = {
trigger = { has_trait = gregarious }
save_scope_value_as = {
name = false_flag_type
value = flag:gregarious
}
}
# ambitious
100 = {
trigger = { has_trait = ambitious }
save_scope_value_as = {
name = false_flag_type
value = flag:ambitious
}
}
# content
100 = {
trigger = { has_trait = content }
save_scope_value_as = {
name = false_flag_type
value = flag:content
}
}
# arbitrary
100 = {
trigger = { has_trait = arbitrary }
save_scope_value_as = {
name = false_flag_type
value = flag:arbitrary
}
}
# just
100 = {
trigger = { has_trait = just }
save_scope_value_as = {
name = false_flag_type
value = flag:just
}
}
# cynical
100 = {
trigger = { has_trait = cynical }
save_scope_value_as = {
name = false_flag_type
value = flag:cynical
}
}
# zealous
100 = {
trigger = { has_trait = zealous }
save_scope_value_as = {
name = false_flag_type
value = flag:zealous
}
}
# paranoid
100 = {
trigger = { has_trait = paranoid }
save_scope_value_as = {
name = false_flag_type
value = flag:paranoid
}
}
# trusting
100 = {
trigger = { has_trait = trusting }
save_scope_value_as = {
name = false_flag_type
value = flag:trusting
}
}
# compassionate
100 = {
trigger = { has_trait = compassionate }
save_scope_value_as = {
name = false_flag_type
value = flag:compassionate
}
}
# callous
100 = {
trigger = { has_trait = callous }
save_scope_value_as = {
name = false_flag_type
value = flag:callous
}
}
# sadistic
100 = {
trigger = { has_trait = sadistic }
save_scope_value_as = {
name = false_flag_type
value = flag:sadistic
}
}
# stubborn
100 = {
trigger = { has_trait = stubborn }
save_scope_value_as = {
name = false_flag_type
value = flag:stubborn
}
}
# fickle
100 = {
trigger = { has_trait = fickle }
save_scope_value_as = {
name = false_flag_type
value = flag:fickle
}
}
# vengeful
100 = {
trigger = { has_trait = vengeful }
save_scope_value_as = {
name = false_flag_type
value = flag:vengeful
}
}
# forgiving
100 = {
trigger = { has_trait = forgiving }
save_scope_value_as = {
name = false_flag_type
value = flag:forgiving
}
}
# fallback_1
100 = {
save_scope_value_as = {
name = false_flag_type
value = flag:fallback_1
}
}
# fallback_2
100 = {
save_scope_value_as = {
name = false_flag_type
value = flag:fallback_2
}
}
# fallback_3
100 = {
save_scope_value_as = {
name = false_flag_type
value = flag:fallback_3
}
}
# fallback_4
100 = {
save_scope_value_as = {
name = false_flag_type
value = flag:fallback_4
}
}
# fallback_5
100 = {
save_scope_value_as = {
name = false_flag_type
value = flag:fallback_5
}
}
}
}
# Sort scopes for event options.
scope:actor = {
# If scope:actor has a nemesis, save them for loc.
if = {
limit = {
any_relation = {
type = nemesis
count >= 1
ep1_character_interaction_0001_valid_hostile_relation_trigger = yes
}
}
random_relation = {
type = nemesis
limit = { ep1_character_interaction_0001_valid_hostile_relation_trigger = yes }
save_scope_as = actor_nemesis
}
}
# If scope:actor has any valid rivals, pick a random one for option B.
if = {
limit = {
any_relation = {
type = rival
count >= 1
ep1_character_interaction_0001_valid_rival_trigger = yes
}
}
random_relation = {
type = rival
# Prefer rivals that are targets of hostile schemes.
limit = {
any_targeting_scheme = {
scheme_owner = scope:actor
is_hostile = yes
}
ep1_character_interaction_0001_valid_rival_trigger = yes
}
# Failing that, rivals who are targets of any schemes.
alternative_limit = {
any_targeting_scheme = {
scheme_owner = scope:actor
is_hostile = no
}
ep1_character_interaction_0001_valid_rival_trigger = yes
}
# Otherwise just any rando rival who could be schemed against.
alternative_limit = { ep1_character_interaction_0001_valid_rival_trigger = yes }
save_scope_as = actor_rival
}
}
}
}
# *Cackling* Oh yes, [actor_nemesis.GetFirstName] will never see this coming!
option = {
name = ep1_character_interaction.0001.a
trigger = { exists = scope:actor_nemesis }
# Quietly add scope:recipient as a courtier of scope:actor_nemesis.
ep1_character_interaction_0001_move_character_and_family_effect = { DESTINATION = scope:actor_nemesis }
stress_impact = {
patient = miniscule_stress_impact_loss
vengeful = minor_stress_impact_loss
impatient = medium_stress_impact_gain
trusting = major_stress_impact_gain
}
ai_chance = {
# If valid, this should always be the choice selected.
base = 100
}
}
# Excellent! Now, you will deliver yourself to [actor_rival.GetFirstNamePossessive] court...
option = {
name = ep1_character_interaction.0001.b
trigger = { exists = scope:actor_rival }
# Quietly add scope:recipient as a courtier of scope:actor_rival.
ep1_character_interaction_0001_move_character_and_family_effect = { DESTINATION = scope:actor_rival }
stress_impact = {
patient = miniscule_stress_impact_loss
vengeful = minor_stress_impact_loss
impatient = medium_stress_impact_gain
trusting = major_stress_impact_gain
}
ai_chance = {
# Never pick this option...
base = 0
# ... unless there's no nemesis, in which case it should be the default.
modifier = {
add = 100
NOT = { exists = scope:actor_rival }
}
}
}
# Now, begone till I have need of you.
option = {
name = ep1_character_interaction.0001.c
# Boot 'em out.
hidden_effect = {
scope:recipient = { select_and_move_to_pool_effect = yes }
}
show_as_tooltip = {
remove_courtier_or_guest = scope:recipient
}
stress_impact = {
shy = minor_stress_impact_loss
gregarious = minor_stress_impact_gain
}
ai_chance = {
# AI should never be taking this without a nemesis, but if they do, it doesn't matter where they send scope:recipient.
base = 0
}
}
# Naturally, you will stay where I can keep an eye on you.
option = {
name = ep1_character_interaction.0001.d
# Status quo: no extra changes here.
# No stress impact necessary for the fallback option.
ai_chance = {
# AI should never be taking this without a nemesis, but if they do, it doesn't matter where they send scope:recipient.
base = 0
}
}
}

View file

@ -0,0 +1,552 @@
namespace = court_position
################################
# FLAVOR EVENTS
# 1001 - 8999
################################
#############################
# MURDER SAVE EVENTS
# 9001 - 9199
# by Linnéa Thimrén
#############################
###############
# SAVED BY FOOD TASTER
# FOR MURDERER: Saved from poisoned food by food taster
# by Linnéa Thimrén
court_position.9001 = {
type = character_event
window = scheme_failed_event
title = court_position.9001.t
desc = {
desc = court_position.9001.desc
triggered_desc = {
trigger = { exists = local_var:food_taster_dies }
desc = court_position.9001.food_taster_dies
}
}
theme = murder_scheme
left_portrait = {
character = scope:owner
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
center_portrait = {
character = scope:food_taster
animation = poison
}
right_portrait = {
character = scope:target
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = rage
}
animation = paranoia
}
override_background = { reference = feast }
widget = {
gui = "event_window_widget_scheme"
container = "custom_widgets_container"
}
trigger = {
scope:target = {
employs_court_position = food_taster_court_position
any_court_position_holder = {
type = food_taster_court_position
foodtaster_will_actually_do_job_trigger = yes
}
}
}
immediate = {
scope:target = {
random_court_position_holder = {
type = food_taster_court_position
limit = { is_physically_able = yes }
save_scope_as = food_taster
}
}
murder_failure_effect = yes
hidden_effect = {
random = {
chance = 75
set_local_variable = {
name = food_taster_dies
value = yes
}
}
}
}
option = {
name = murder_save.0001.a
scope:scheme = { end_scheme = yes }
}
option = {
name = murder_save.0001.b
restart_murder_scheme_effect = yes
}
after = {
# Fire the rest of the outcome.
scope:target = { trigger_event = court_position.9002 }
if = {
limit = { exists = local_var:food_taster_dies }
show_as_tooltip = {
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:food_taster
REASON = death_poison
}
}
}
}
}
# FOR TARGET: Food taster dies to poison
court_position.9002 = {
type = character_event
window = scheme_target_event
title = court_position.9001.t
desc = {
desc = court_position.9002.desc
triggered_desc = {
trigger = { exists = local_var:food_taster_dies }
desc = court_position.9002.food_taster_dies
}
triggered_desc = {
trigger = { exists = scope:scheme_discovered }
desc = court_position.9002.owner_discovered
}
}
theme = murder_scheme
left_portrait = {
character = scope:target
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = rage
}
animation = paranoia
}
center_portrait = {
character = scope:food_taster
animation = poison
}
right_portrait = {
character = scope:owner_to_reveal
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
immediate = {
set_variable = {
name = block_death_event_from
value = scope:food_taster
days = 3
}
# Handle the death of the food taster, if necessary
if = {
limit = { exists = local_var:food_taster_dies }
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:food_taster
REASON = death_poison
}
}
}
# Who could do such a thing?
option = {
name = murder_save.1001.a
trigger = {
NOT = { exists = scope:scheme_discovered }
}
custom_tooltip = murder_save.failure_unknown_owner_tt
}
# Vengeance!
option = {
name = murder_save.1001.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
}
}
}
###############
# SAVED BY CUP-BEARER
# FOR MURDERER: Saved from poisoned drink by cup-bearer
# by Linnéa Thimrén
court_position.9011 = {
type = character_event
window = scheme_failed_event
title = court_position.9011.t
desc = {
desc = court_position.9011.desc
triggered_desc = {
trigger = { exists = local_var:cupbearer_dies }
desc = court_position.9011.cupbearer_dies
}
}
theme = murder_scheme
left_portrait = {
character = scope:owner
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
center_portrait = {
character = scope:food_taster
animation = poison
}
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 = {
scope:target = {
employs_court_position = cupbearer_court_position
any_court_position_holder = {
type = cupbearer_court_position
cupbearer_will_actually_do_job_trigger = yes
}
}
}
immediate = {
scope:target = {
random_court_position_holder = {
type = cupbearer_court_position
limit = { is_physically_able = yes }
save_scope_as = cupbearer
}
}
murder_failure_effect = yes
hidden_effect = {
random = {
chance = 75
set_local_variable = {
name = cupbearer_dies
value = yes
}
}
}
}
option = {
name = murder_save.0001.a
scope:scheme = { end_scheme = yes }
}
option = {
name = murder_save.0001.b
restart_murder_scheme_effect = yes
}
after = {
# Fire the rest of the outcome.
scope:target = { trigger_event = court_position.9012 }
if = {
limit = { exists = local_var:cupbearer_dies }
show_as_tooltip = {
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:cupbearer
REASON = death_poison
}
}
}
}
}
# FOR TARGET: Cup-bearer dies to poison
court_position.9012 = {
type = character_event
window = scheme_target_event
title = court_position.9011.t
desc = {
desc = court_position.9012.desc
triggered_desc = {
trigger = { exists = local_var:cupbearer_dies }
desc = court_position.9012.cupbearer_dies
}
triggered_desc = {
trigger = { exists = scope:scheme_discovered }
desc = court_position.9002.owner_discovered
}
}
theme = murder_scheme
left_portrait = {
character = scope:target
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = rage
}
animation = paranoia
}
center_portrait = {
character = scope:food_taster
animation = poison
}
right_portrait = {
character = scope:owner_to_reveal
triggered_animation = {
trigger = { exists = scope:scheme_discovered }
animation = fear
}
animation = stress
}
immediate = {
set_variable = {
name = block_death_event_from
value = scope:cupbearer
days = 3
}
# Handle the death of the cupbearer, if necessary
if = {
limit = { exists = local_var:cupbearer_dies }
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:cupbearer
REASON = death_poison
}
}
}
# Who could do such a thing?
option = {
name = murder_save.1001.a
trigger = {
NOT = { exists = scope:scheme_discovered }
}
custom_tooltip = murder_save.failure_unknown_owner_tt
}
# Vengeance!
option = {
name = murder_save.1001.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
}
}
}
###############
# SAVED BY BODYGUARD
# FOR MURDERER: Saved from assassin by bodyguard
# by Linnéa Thimrén
court_position.9021 = {
type = character_event
window = scheme_failed_event
title = court_position.9021.t
desc = {
desc = court_position.9021.desc
triggered_desc = {
trigger = { exists = local_var:bodyguard_dies }
desc = court_position.9021.bodyguard_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 = {
scope:target = {
employs_court_position = bodyguard_court_position
any_court_position_holder = {
type = bodyguard_court_position
bodyguard_will_actually_do_job_trigger = yes
}
}
}
immediate = {
scope:target = {
random_court_position_holder = {
type = bodyguard_court_position
limit = { is_physically_able = yes }
save_scope_as = bodyguard
}
}
murder_failure_effect = yes
hidden_effect = {
random = {
chance = 75
set_local_variable = {
name = bodyguard_dies
value = yes
}
}
}
}
option = {
name = murder_save.0001.a
scope:scheme = { end_scheme = yes }
}
option = {
name = murder_save.0001.b
restart_murder_scheme_effect = yes
}
after = {
# Fire the rest of the outcome.
scope:target = { trigger_event = court_position.9022 }
if = {
limit = { exists = local_var:bodyguard_dies }
show_as_tooltip = {
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:bodyguard
REASON = death_murder
}
}
}
}
}
# FOR TARGET: Bodyguard dies to assassin
court_position.9022 = {
type = character_event
window = scheme_target_event
title = court_position.9021.t
desc = {
desc = court_position.9022.desc
triggered_desc = {
trigger = { exists = local_var:bodyguard_dies }
desc = court_position.9022.bodyguard_dies
}
triggered_desc = {
trigger = { exists = scope:scheme_discovered }
desc = court_position.9002.owner_discovered
}
}
theme = murder_scheme
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 = {
set_variable = {
name = block_death_event_from
value = scope:bodyguard
days = 3
}
# Handle the death of the bodyguard, if necessary
if = {
limit = { exists = local_var:bodyguard_dies }
murder_interception_handle_extra_deaths_effect = {
VICTIM = scope:bodyguard
REASON = death_murder
}
}
}
# Who could do such a thing?
option = {
name = murder_save.1001.a
trigger = {
NOT = { exists = scope:scheme_discovered }
}
custom_tooltip = murder_save.failure_unknown_owner_tt
}
# Vengeance!
option = {
name = murder_save.1001.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
}
}
}

View file

@ -0,0 +1,575 @@
namespace = ep1_decision
##################################################
#
# Royal Court Court Grandeur Level & Amenity Decisions Events
#
# COURT GRANDEUR LEVELS
# 0001 - 0010 Host Fundraiser
# 0011 - 0020 Host Summit
#
# AMENITIES
# 0101 - 0110 Order Mass Eviction
# 0111 - 0120 Commission Exotic Bedchamber
##################################################
##################################################
# COURT GRANDEUR LEVELS
ep1_decision.0201 = {
type = character_event
title = ep1_decision.0201.t
desc = ep1_decision.0201.desc
theme = education
left_portrait = scope:good_linguist
lower_left_portrait = scope:cheap_linguist
right_portrait = scope:medium_linguist
lower_right_portrait = scope:scholarly_linguist
override_background = { reference = throne_room }
immediate = {
### Save cultures and languages
# Find 1st culture that speaks target language natively
random_culture_global = {
limit = {
exists = culture_head
scope:target_court_language = { has_court_language_of_culture = prev }
}
save_scope_as = ling_cul_1
}
# Save liege as example to fetch faiths if relevant
if = {
limit = {
exists = scope:language_scheme_type
liege = { has_court_language_of_culture = root.liege.culture }
}
liege = { save_scope_as = ling_cul_1_ruler }
}
# Otherwise find random cul_1 ruler
else = {
linguist_random_realm_effect = { CULTURE = ling_cul_1 }
}
# Find 2nd culture that speaks target language natively
if = {
limit = {
any_culture_global = {
exists = culture_head
scope:target_court_language = { has_court_language_of_culture = prev }
THIS != scope:ling_cul_1
}
}
random_culture_global = {
limit = {
exists = culture_head
scope:target_court_language = { has_court_language_of_culture = prev }
THIS != scope:ling_cul_1
}
save_scope_as = ling_cul_2
}
}
# If none, duplicate 1st
else = {
scope:ling_cul_1 = { save_scope_as = ling_cul_2 }
}
# Save random ruler of cul 2 to find faith
linguist_random_realm_effect = { CULTURE = ling_cul_2 }
# Save own culture
culture = { save_scope_as = ling_cul_3 }
# Bonus languages good linguists may know in addition to root and target
linguist_bonus_culture_effect = { CULTURE = ling_cul_1 }
linguist_bonus_culture_effect = { CULTURE = ling_cul_2 }
linguist_bonus_culture_effect = { CULTURE = ling_cul_3 }
#### Create Linguists
hidden_effect = {
# Poor Linguist
if = {
limit = { has_trait = greedy }
create_character = {
dynasty = none
template = court_linguist_cheap_template
location = root.capital_province
save_scope_as = cheap_linguist
}
}
# Average Linguist
create_character = {
dynasty = none
template = court_linguist_medium_template
location = root.capital_province
save_scope_as = medium_linguist
}
# Good Linguist
create_character = {
dynasty = none
template = court_linguist_good_template
culture = scope:ling_cul_2
faith = scope:ling_cul_2_ruler.faith
location = root.capital_province
save_scope_as = good_linguist
}
# Scholarly Linguist
if = {
limit = { has_trait = scholar }
create_character = {
dynasty = none
template = court_linguist_good_template
culture = scope:ling_cul_1
faith = scope:ling_cul_1_ruler.faith
location = root.capital_province
trait = scholar
save_scope_as = scholarly_linguist
}
if = {
limit = {
exists = scope:ling_cul_2_bonus
NOT = {
scope:scholarly_linguist = { knows_language_of_culture = scope:ling_cul_2_bonus }
}
}
scope:scholarly_linguist = { learn_language_of_culture = scope:ling_cul_2_bonus }
}
}
}
}
# Expensive linguist, great teacher
option = {
name = ep1_decision.0201.a
pay_short_term_gold = {
target = scope:good_linguist
gold = medium_gold_value
}
learn_language_linguist_effect = { LINGUIST = scope:good_linguist }
stress_impact = {
greedy = medium_stress_impact_gain
}
ai_chance = {
base = 100
modifier = {
short_term_gold < medium_gold_value
factor = 0
}
}
}
# Cheaper linguist; less learning, not a good teacher
option = {
name = ep1_decision.0201.b
pay_short_term_gold = {
target = scope:medium_linguist
gold = minor_gold_value
}
learn_language_linguist_effect = { LINGUIST = scope:medium_linguist }
stress_impact = {
greedy = medium_stress_impact_gain
}
ai_chance = {
base = 100
modifier = {
short_term_gold < minor_gold_value_check
factor = 0
}
}
}
# I know a good tutor through scholarly circles!
option = {
name = ep1_decision.0201.c
trait = scholar
trigger = { has_trait = scholar }
learn_language_linguist_effect = { LINGUIST = scope:scholarly_linguist }
ai_chance = {
base = 100
}
}
# I'm cheap, get me anyone who can vaguely speak my language
option = {
name = ep1_decision.0201.d
trait = greedy
trigger = { has_trait = greedy }
learn_language_linguist_effect = { LINGUIST = scope:cheap_linguist }
ai_chance = {
base = 1000
modifier = { # Don't do it if you can hire the cool guy
has_trait = scholar
factor = 0
}
}
}
# On seconds thoughts, I won't hire a linguist at all...
option = {
name = ep1_decision.0201.e
ai_chance = {
base = 0
modifier = {
short_term_gold < minor_gold_value_check
NOR = {
has_trait = scholar
has_trait = greedy
}
add = 10
}
}
}
after = {
every_in_list = {
list = court_linguist_list
limit = {
NOT = { is_courtier_of = root }
}
silent_disappearance_effect = yes
}
}
}
##################################################
# AMENITIES
##################################################
# Out with the Old
# by Ewan Cowhig Croft
# 0101 - 0110
##################################################
# Pay a little prestige to boot out all the guests from your palace.
ep1_decision.0101 = {
type = character_event
title = ep1_decision.0101.t
desc = ep1_decision.0101.desc
theme = court
left_portrait = {
character = root
animation = personality_rational
}
override_background = { reference = throne_room }
immediate = {
# Grab the capital for easy loc.
capital_barony = { save_scope_as = capital }
}
# Scope:capital is not an inn. Away, leeches!
option = {
name = ep1_decision.0101.a
# Evict your guests.
order_mass_eviction_decision_guests_only_effect = yes
stress_impact = {
shy = minor_stress_impact_loss
gregarious = medium_stress_impact_gain
}
ai_chance = {
# AI cannot access this event.
base = 100
}
}
# Everyone who doesn't have a job or a close blood tie, *out*!
option = {
name = ep1_decision.0101.b
trigger = {
# If you have no spare rooms at all, you can dismiss useless courtiers for a bit extra.
amenity_level = {
target = court_lodging_standards
value <= low_amenity_level
}
}
# Charge an extra premium.
add_prestige = {
value = order_mass_eviction_decision_cost_value
multiply = -1
}
# Evict your guests *&* courtiers.
order_mass_eviction_decision_courtiers_&_guests_effect = yes
stress_impact = {
shy = medium_stress_impact_loss
gregarious = major_stress_impact_gain
}
ai_chance = {
# AI cannot access this event.
base = 100
}
}
# On seconds thoughts, this is unbecoming...
option = {
name = ep1_decision.0101.c
# Return invested prestige.
hidden_effect = { add_prestige_no_experience = order_mass_eviction_decision_cost_value }
# & reset the cooldown.
remove_decision_cooldown = order_mass_eviction_decision
# No stress impact for cancelling out of the decision.
ai_chance = {
# AI cannot access this event.
base = 100
}
}
}
##################################################
# Grandiose Decor
# by Ewan Cowhig Croft
# 0111 - 0120
##################################################
# For technical reasons, this trigger can't be the same as exoticise_a_grand_hall_decision_list_builder_guts_trigger, but maintains (almost) technical parity with it.
scripted_trigger ep1_decision_0111_list_builder_guts_trigger = {
# Is the title presently active?
is_title_created = yes
# Filter out anyone already in the list.
NOT = { is_in_list = royal_courts_list }
# Check assorted holder things.
holder = {
# Filter out anyone who has the right rank but lacks a mechanical royal court.
has_royal_court = yes
this != root
# Can the two communicate?
in_diplomatic_range = root
}
}
scripted_effect ep1_decision_0111_apply_hall_effect = {
# Add mutual opinion for each non-AI involved with the interaction.
$CHOICE$ = {
if = {
limit = { is_ai = yes }
add_opinion = {
target = root
modifier = flattered_opinion
opinion = 30
}
}
}
if = {
limit = { is_ai = yes }
add_opinion = {
target = $CHOICE$
modifier = impressed_opinion
opinion = 30
}
}
# Gain a fraction of the CGV difference.
change_current_court_grandeur = $CHOICE$.ep1_decision_0111_proportional_cgv_gain_value
# Pay prestige proportional to how much CGV is gained.
add_prestige = $CHOICE$.ep1_decision_0111_proportional_prestige_cost_value
# Hand over a lil participation prestige for $CHOICE$ so that they know someone thinks their court is rad.
$CHOICE$ = {
send_interface_toast = {
title = ep1_decision.0111.toast.t
left_icon = root
# Give a little more for emperors doing this.
if = {
limit = { $CHOICE$.primary_title.tier >= tier_empire }
add_prestige = medium_prestige_gain
}
# Otherwise, just a few crumbs of prestige.
else = { add_prestige = minor_prestige_gain }
}
}
# Stress impact handled in the scripted effect, since it'll always be the same for each char.
stress_impact = {
architect = minor_stress_impact_loss
humble = medium_stress_impact_loss
arrogant = major_stress_impact_gain
}
}
# Arrange for a major room to be remodelled with decor inspired by a more grandiose culture.
ep1_decision.0111 = {
type = character_event
title = ep1_decision.0111.t
desc = ep1_decision.0111.desc
theme = court
left_portrait = {
character = root
animation = throne_room_conversation_4
}
lower_left_portrait = scope:option_1
lower_center_portrait = scope:option_2
lower_right_portrait = scope:option_3
immediate = {
# Build a list of suitable courts.
## We add the title rather than the characters to the list for a cleaner debug tooltip in-game.
every_empire = {
limit = { ep1_decision_0111_list_builder_guts_trigger = yes }
# Rack 'em up.
add_to_list = royal_courts_list
}
every_kingdom = {
limit = { ep1_decision_0111_list_builder_guts_trigger = yes }
# Rack 'em up.
add_to_list = royal_courts_list
}
# Then, filter through the list and grab appropriate options.
ordered_in_list = {
list = royal_courts_list
max = 4
check_range_bounds = no
order_by = {
# Use CGV as a base.
add = holder.court_grandeur_current
# Weight up for neighbouring realms.
if = {
limit = {
holder = {
OR = {
any_neighboring_and_across_water_realm_same_rank_owner = { this = root }
any_neighboring_and_across_water_top_liege_realm_owner = { this = root }
}
}
}
multiply = 5
}
}
if = {
limit = {
NOT = { exists = scope:option_1 }
}
holder = { save_scope_as = option_1 }
}
else_if = {
limit = {
NOT = {
holder = { this = scope:option_1 }
exists = scope:option_2
}
}
holder = { save_scope_as = option_2 }
}
else_if = {
limit = {
NOT = {
holder = { this = scope:option_1 }
holder = { this = scope:option_2 }
exists = scope:option_3
}
}
holder = { save_scope_as = option_3 }
}
}
}
# Scope:option_1 is a grand, grand place.
option = {
name = {
trigger = { scope:option_1.court_grandeur_current > root.court_grandeur_current }
text = ep1_decision.0111.a.greater_cgv
}
name = {
trigger = { always = yes }
text = ep1_decision.0111.a.lesser_cgv
}
trigger = { exists = scope:option_1 }
# Build a hall in the relevant scope's style.
ep1_decision_0111_apply_hall_effect = { CHOICE = scope:option_1 }
# Stress_impact block handled in the scripted effect.
ai_chance = {
# Generally equal likelihood for each option.
base = 100
# Otherwise, people want to model themselves after characters they like.
#opinion_modifier = { opinion_target = scope:option_1 }
}
}
# I find the architecture of scope:option_2 enthralling!
option = {
name = {
trigger = { scope:option_2.court_grandeur_current > root.court_grandeur_current }
text = ep1_decision.0111.b.greater_cgv
}
name = {
trigger = { always = yes }
text = ep1_decision.0111.b.lesser_cgv
}
trigger = { exists = scope:option_2 }
# Build a hall in the relevant scope's style.
ep1_decision_0111_apply_hall_effect = { CHOICE = scope:option_2 }
# Stress_impact block handled in the scripted effect.
ai_chance = {
# Generally equal likelihood for each option.
base = 100
# Otherwise, people want to model themselves after characters they like.
#opinion_modifier = { opinion_target = scope:option_2 }
}
}
# Perhaps a scope:option_3ikkan lounge?
option = {
name = {
trigger = { scope:option_3.court_grandeur_current > root.court_grandeur_current }
text = ep1_decision.0111.c.greater_cgv
}
name = {
trigger = { always = yes }
text = ep1_decision.0111.c.lesser_cgv
}
trigger = { exists = scope:option_3 }
# Build a hall in the relevant scope's style.
ep1_decision_0111_apply_hall_effect = { CHOICE = scope:option_3 }
# Stress_impact block handled in the scripted effect.
ai_chance = {
# Generally equal likelihood for each option.
base = 100
# Otherwise, people want to model themselves after characters they like.
#opinion_modifier = { opinion_target = scope:option_3 }
}
}
# These all seem quite foreign...
option = {
name = ep1_decision.0111.d
# Refund the gold paid; we mention this in a tooltip so that it's a bit less noticeable.
hidden_effect = { add_gold = var:exoticise_a_grand_hall_decision_refund_value }
custom_tooltip = ep1_decision.0111.d.tt
# Take the decision off cooldown.
remove_decision_cooldown = exoticise_a_grand_hall_decision
# No stress impact for cancelling out.
ai_chance = {
# If the AI has gotten this far, they should pick an option.
base = 0
}
}
after = {
# Whatever else happens, clear the refund value.
remove_variable = exoticise_a_grand_hall_decision_refund_value
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,483 @@
namespace = fund_inspiration
# Adventurer fights a bandit
# Adventurer travels through beast-infested terrain
# Adventurer fights a bandit
fund_inspiration.9000 = {
type = character_event
title = fund_inspiration.9000.t
desc = fund_inspiration.9000.desc
theme = war
left_portrait = {
character = scope:adventurer
animation = worry
}
right_portrait = {
character = scope:bandit
animation = throne_room_one_handed_passive_1
}
override_background = {
reference = wilderness_scope
}
cooldown = { years = 5 }
trigger = {
exists = scope:inspiration
scope:inspiration_owner = {
exists = var:adventure_destination
exists = var:adventure_type
NOR = {
has_character_flag = fund_adventure_inspiration_event_cooldown
}
exists = location
any_pool_character = {
province = scope:inspiration_owner.location
is_available_ai_adult = yes
}
}
}
immediate = {
scope:inspiration_owner = {
save_scope_as = adventurer
location.barony.title_province = { save_scope_as = background_wilderness_scope }
random_pool_character = {
province = location.barony.title_province
limit = {
is_available_ai_adult = yes
}
weight = {
base = 10
modifier = {
can_be_combatant_based_on_gender_trigger = { ARMY_OWNER = THIS }
add = 100
}
}
save_scope_as = bandit
}
}
}
option = {
name = fund_inspiration.9000.a
scope:adventurer = {
duel = {
skill = intrigue
target = scope:bandit
2 = {
desc = fund_inspiration.9000.a.critical_success
compare_modifier = {
value = scope:duel_value
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.a.critical_success
left_icon = scope:adventurer
scope:inspiration = { change_inspiration_progress = 2 }
scope:bandit = {
pay_short_term_gold = {
target = root
gold = medium_gold_value
}
}
hidden_effect = { # The adventurer also gains some gold!
scope:bandit = {
pay_short_term_gold = {
target = scope:adventurer
gold = medium_gold_value
}
}
}
}
}
}
8 = {
desc = fund_inspiration.9000.a.success
compare_modifier = {
value = scope:duel_value
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.a.success
left_icon = scope:adventurer
scope:inspiration = { change_inspiration_progress = 1 }
}
}
}
8 = {
desc = fund_inspiration.9000.a.failure
compare_modifier = {
value = scope:duel_value
multiplier = -1
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.a.failure
left_icon = scope:adventurer
scope:adventurer = {
increase_wounds_effect = { REASON = fight }
}
scope:inspiration = { change_inspiration_progress = -2 }
}
}
}
}
}
ai_chance = {
base = 4
modifier = {
add = scope:adventurer.intrigue
}
modifier = {
add = {
value = scope:bandit.intrigue
multiply = -1
}
}
}
}
option = {
name = fund_inspiration.9000.b
scope:adventurer = {
duel = {
skill = prowess
target = scope:bandit
1 = {
desc = fund_inspiration.9000.b.critical_success
compare_modifier = {
value = scope:duel_value
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.b.critical_success
left_icon = scope:adventurer
scope:adventurer = {
if = {
limit = {
NOR = {
has_trait = compassionate
ai_compassion >= high_positive_ai_value
}
}
hidden_effect = {
scope:bandit = {
death = {
death_reason = death_duel
killer = scope:adventurer
}
}
}
custom_tooltip = fund_inspiration.9000.b.boil_skull
scope:inspiration_owner = {
change_artifact_quality_effect = { AMOUNT = 4 }
}
root = {
hidden_effect_new_object = {
create_artifact_pedestal_human_skull_effect = {
OWNER = root
CREATOR = scope:adventurer
DESKULLED = scope:bandit
}
scope:newly_created_artifact = {
set_artifact_description = artifact_bandit_skull
}
}
}
}
else = {
scope:bandit = {
death = {
death_reason = death_duel
killer = scope:adventurer
}
scope:inspiration_owner = {
change_artifact_quality_effect = { AMOUNT = 4 }
}
scope:inspiration = { change_inspiration_progress = 1 }
}
}
}
}
}
}
11 = {
desc = fund_inspiration.9000.b.success
compare_modifier = {
value = scope:duel_value
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.b.success
left_icon = scope:adventurer
scope:adventurer = {
scope:bandit = {
increase_wounds_effect = { REASON = fight }
}
scope:inspiration_owner = {
change_artifact_quality_effect = { AMOUNT = 2 }
}
}
}
}
}
8 = {
desc = fund_inspiration.9000.b.failure
compare_modifier = {
value = scope:duel_value
multiplier = -1
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.b.failure
left_icon = scope:adventurer
scope:adventurer = {
increase_wounds_effect = { REASON = fight }
}
}
}
}
1 = {
desc = fund_inspiration.9000.b.critical_failure
compare_modifier = {
value = scope:duel_value
multiplier = -1
}
root = {
send_interface_toast = {
title = fund_inspiration.9000.b.critical_failure
left_icon = scope:adventurer
scope:adventurer = {
death = {
death_reason = death_duel
killer = scope:bandit
}
}
}
}
}
}
}
ai_chance = {
base = 4
modifier = {
add = scope:adventurer.prowess
}
modifier = {
add = {
value = scope:bandit.prowess
multiply = -1
}
}
}
}
option = {
name = fund_inspiration.9000.c
pay_short_term_gold = {
target = scope:bandit
gold = minor_gold_value
}
ai_chance = {
base = 8
modifier = {
factor = 2
ai_compassion >= medium_positive_ai_value
}
modifier = {
factor = 0.1
OR = {
has_trait = stubborn
has_trait = wrathful
has_trait = greedy
}
}
modifier = {
factor = 0
gold < 0
}
}
}
}
# Adventurer travels through beast-infested terrain
fund_inspiration.9100 = {
type = character_event
title = fund_inspiration.9100.t
desc = fund_inspiration.9100.desc
theme = war
left_portrait = {
character = scope:adventurer
scripted_animation = duel_wield_weapon
}
override_background = {
reference = wilderness_scope
}
cooldown = { years = 5 }
trigger = {
exists = scope:inspiration
scope:inspiration_owner = {
exists = var:adventure_destination
exists = var:adventure_type
NOR = {
has_character_flag = fund_adventure_inspiration_event_cooldown
has_trait = humble
has_trait = content
}
exists = location
}
}
immediate = {
scope:inspiration_owner = {
save_scope_as = adventurer
location.barony.title_province = { save_scope_as = background_wilderness_scope }
scope:adventurer = {
select_local_animal_effect = { TYPE = dangerous } # Save scope to limit possible animals: any/big/small/dangerous/harmless/prowling
}
}
}
option = {
name = fund_inspiration.9100.a
scope:adventurer = {
duel = {
skill = learning
value = 8
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = fund_inspiration.9100.a.success
root = {
send_interface_toast = {
title = fund_inspiration.9100.a.success
left_icon = scope:adventurer
scope:inspiration = { change_inspiration_progress = 2 }
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = fund_inspiration.9100.a.failure
send_interface_toast = {
title = fund_inspiration.9100.a.failure
left_icon = scope:adventurer
root = {
scope:adventurer = {
increase_wounds_effect = { REASON = fight }
}
}
}
}
}
}
ai_chance = {
base = 4
modifier = {
add = scope:adventurer.learning
}
}
}
option = {
name = fund_inspiration.9100.b
scope:adventurer = {
duel = {
skill = prowess
value = 8
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = fund_inspiration.9100.b.success
root = {
send_interface_toast = {
title = fund_inspiration.9100.b.success
left_icon = scope:adventurer
scope:inspiration_owner = {
change_artifact_quality_effect = { AMOUNT = 3 }
}
scope:inspiration = { change_inspiration_progress = 1 }
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = fund_inspiration.9100.b.failure
root = {
send_interface_toast = {
title = fund_inspiration.9100.b.failure
left_icon = scope:adventurer
scope:adventurer = {
increase_wounds_effect = { REASON = fight }
random = {
chance = 25
custom_tooltip = fund_inspiration.9100.b.maimed
hidden_effect = {
maimed_in_battle_effect = yes
}
}
}
}
}
}
}
}
ai_chance = {
base = 4
modifier = {
add = scope:adventurer.prowess
}
}
}
option = {
name = fund_inspiration.9100.c
scope:inspiration = { change_inspiration_progress = -1 }
ai_chance = {
base = 4
modifier = {
factor = 2
ai_compassion >= medium_positive_ai_value
}
}
}
}

View file

@ -0,0 +1,146 @@
namespace = inspiration_system
##################################################
# Inspiration Generation
# Checks how many inspirations currently exist and, if there are not enough, generates new ones for pool characters.
# by Sean Hughes
# 0005
##################################################
inspiration_system.0005 = {
scope = none
hidden = yes
trigger = {
has_ep1_dlc_trigger = yes
num_world_inspired_characters_value < ideal_total_world_inspirations
}
immediate = {
set_local_variable = {
name = try_create_inspiration_attempts
value = max_new_inspirations_per_year_value
}
while = {
limit = {
AND = {
local_var:try_create_inspiration_attempts > 0
num_world_inspired_characters_value < ideal_total_world_inspirations
}
}
grant_new_inspiration_in_world_effect = yes
change_local_variable = {
name = try_create_inspiration_attempts
subtract = 1
}
}
}
}
##################################################
# Inspired Character Maintenance
# Every Royal Court owner occasionally checks guests who have an Inspiration and, if unsponsored, moves them to a different Royal Court
# by Sean Hughes
# 1001-1101
##################################################
inspiration_system.1001 = {
hidden = yes
trigger = {
has_ep1_dlc_trigger = yes
}
immediate = {
every_pool_guest = {
limit = {
exists = inspiration
NOR = {
# Inspiration is not currently being sponsored
inspiration = { exists = inspiration_sponsor }
# Has not arrived at our court in the last X months (defined in 00_ep1_script_values.txt )
has_character_flag = inspired_character_recent_arrival
}
}
if = {
limit = {
inspiration = {
days_since_creation > 3650
}
}
# Destroy our inspiration, since nobody seems interested in sponsoring it.
trigger_event = inspiration_system.1101
}
else = {
# Look for a new royal court to visit.
inspired_character_seek_out_new_royal_court_effect = yes
}
}
}
}
# After going an extended period of time without being recruited or having their Inspiration sponsored, characters lose it in order to make room for new Inspired characters in the pool.
inspiration_system.1101 = {
hidden = yes
immediate = {
destroy_inspiration = inspiration
move_to_pool = yes
# Unrealized potential is tough on people.
random_list = {
25 = {
add_trait = depressed_1
add_stress = minor_stress_gain
}
25 = {
trigger = { can_be_drunkard = yes }
add_trait = drunkard
add_stress = minor_stress_gain
}
25 = {
trigger = { can_be_hashishiyah = yes }
add_trait = hashishiyah
add_stress = minor_stress_gain
}
50 = {
add_stress = major_stress_gain
}
}
}
}
inspiration_system.1200 = { # Courtier becomes Adventurer
type = character_event
hidden = yes
trigger = {
scope:antiquarian_from_task ?= {
has_court_position = antiquarian_court_position
}
scope:adventure_target ?= {
is_physically_able_adult = yes
NOR = {
exists = inspiration
has_court_position = antiquarian_court_position
}
adventure_inspiration_average_skill_value >= medium_inspiration_skill
host ?= root
}
}
immediate = {
send_interface_toast = {
type = msg_court_inspiration
left_icon = scope:adventure_target
right_icon = scope:antiquarian_from_task
title = antiquarian_inspired_adventurer_message
desc = antiquarian_inspired_adventurer_effect
scope:adventure_target = {
create_inspiration = adventure_inspiration
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,696 @@
namespace = ep3_admin_events
# Event to notify you that your liege has changed government and is no longer admin
ep3_admin_events.0001 = {
type = character_event
title = ep3_admin_events.0001.t
desc = {
desc = ep3_admin_events.0001.intro # Fallback
first_valid = {
triggered_desc = {
trigger = { exists = scope:tribal_gov }
desc = ep3_admin_events.0001.tribal
}
triggered_desc = {
trigger = { exists = scope:feudal_gov }
desc = ep3_admin_events.0001.feudal
}
triggered_desc = {
trigger = { exists = scope:clan_gov }
desc = ep3_admin_events.0001.clan
}
desc = ep3_admin_events.0001.fallback
}
}
theme = administrative
left_portrait = {
character = root
triggered_animation = {
trigger = {
OR = {
has_trait = stubborn
has_trait = paranoid
}
}
animation = worry
}
animation = thinking
}
right_portrait = {
character = scope:scribe
animation = chancellor
}
lower_right_portrait = scope:liege
trigger = {
is_landed = yes
}
immediate = {
liege = {
save_scope_as = liege
switch = {
trigger = government_has_flag
government_is_tribal = {
save_scope_as = tribal_gov
}
government_is_feudal = {
save_scope_as = feudal_gov
}
government_is_clan = {
save_scope_as = clan_gov
}
}
if = {
limit = {
NOR = {
exists = scope:tribal_gov
exists = scope:feudal_gov
exists = scope:clan_gov
}
}
save_scope_as = feudal_gov
}
if = {
limit = {
exists = cp:councillor_chancellor
cp:councillor_chancellor = { is_available_healthy_ai_adult = yes }
}
cp:councillor_chancellor = { save_scope_as = scribe }
}
else_if = {
limit = {
any_courtier = { is_available_healthy_ai_adult = yes }
}
ordered_courtier = {
limit = {
is_available_healthy_ai_adult = yes
}
order_by = diplomacy
save_scope_as = scribe
}
}
else = {
create_character = {
location = root.capital_province
template = diplomacy_foreign_affairs_focus_friend_template
faith = scope:liege.capital_county.faith
culture = scope:liege.capital_county.culture
save_scope_as = scribe
}
}
}
scope:scribe = {
assign_quirk_effect = yes
}
admin_change_government_effect = yes
}
option = { # I love change
name = ep3_admin_events.0001.a
add_character_modifier = {
modifier = ep3_admin_change_love
years = 15
}
stress_impact = {
lazy = medium_stress_impact_loss
craven = medium_stress_impact_gain
stubborn = medium_stress_impact_gain
paranoid = medium_stress_impact_gain
diligent = medium_stress_impact_gain
}
ai_chance = {
base = 100
modifier = {
factor = 0
OR = {
has_trait = craven
has_trait = stubborn
has_trait = paranoid
has_trait = diligent
}
}
modifier = {
factor = 2
has_trait = lazy
}
}
}
option = { # I hate this
name = ep3_admin_events.0001.b
add_character_modifier = {
modifier = ep3_admin_change_hate
years = 15
}
stress_impact = {
diligent = medium_stress_impact_loss
brave = medium_stress_impact_gain
lazy = medium_stress_impact_gain
trusting = medium_stress_impact_gain
fickle = medium_stress_impact_gain
}
ai_chance = {
base = 100
modifier = {
factor = 0
OR = {
has_trait = brave
has_trait = lazy
has_trait = trusting
has_trait = fickle
}
}
modifier = {
factor = 2
has_trait = diligent
}
}
}
option = { # I don't care
name = ep3_admin_events.0001.c
ai_chance = {
base = 200
}
}
}
ep3_admin_events.0002 = {
type = character_event
title = ep3_admin_events.0002.t
desc = {
first_valid = {
triggered_desc = { # Liege
trigger = { scope:previous_governor ?= root.liege }
desc = ep3_admin_events.0002.liege
}
triggered_desc = { # Same house died
trigger = {
scope:previous_governor ?= {
is_alive = no
house = root.house
}
}
desc = ep3_admin_events.0002.house_dead
}
triggered_desc = { # Same house fired
trigger = {
scope:previous_governor ?= {
is_alive = yes
house = root.house
}
}
desc = ep3_admin_events.0002.house_alive
}
triggered_desc = { # Diff house died
trigger = {
scope:previous_governor ?= { is_alive = no }
}
desc = ep3_admin_events.0002.dead
}
triggered_desc = { # Diff house fired
trigger = {
scope:previous_governor ?= { is_alive = yes }
}
desc = ep3_admin_events.0002.alive
}
desc = ep3_admin_events.0002.new
}
first_valid = {
triggered_desc = { # Same house
trigger = { scope:previous_governor.house ?= root.house }
desc = ep3_admin_events.0002.house
}
}
#desc = double_line_break
first_valid = {
triggered_desc = {
trigger = { exists = scope:appointment_succession }
desc = ep3_admin_events.0002.appointment_succession
}
triggered_desc = {
trigger = { exists = scope:appointment }
desc = ep3_admin_events.0002.appointment
}
triggered_desc = {
trigger = { exists = scope:conquest }
desc = ep3_admin_events.0002.conquest
}
}
desc = ep3_admin_events.0002.desc
}
theme = administrative
left_portrait = {
character = root
animation = chancellor
}
lower_center_portrait = scope:previous_governor
lower_right_portrait = {
character = root.liege
trigger = {
root.liege != scope:previous_governor
}
}
cooldown = { days = 1 }
trigger = {
this != top_liege
any_held_title = {
tier = root.highest_held_title_tier
is_landless_type_title = no
is_noble_family_title = no
}
NOT = { has_character_flag = successful_governorship_elevation }
}
immediate = {
play_sound_effect = "event:/DLC/EP3/SFX/Stingers/Byzantine_Flavor/ep3_mx_sting_byzantineflavor_become_governor"
ordered_held_title = {
limit = {
tier = root.highest_held_title_tier
is_landless_type_title = no
is_noble_family_title = no
}
save_scope_as = governor_title
previous_holder ?= { save_scope_as = previous_governor }
if = {
limit = {
recent_history = { type = appointment_succession days = 1 }
}
save_scope_as = appointment_succession
}
else_if = {
limit = {
recent_history = { type = appointment days = 1 }
}
save_scope_as = appointment
}
else_if = {
limit = {
recent_history = { type = conquest days = 1 }
}
save_scope_as = conquest
}
}
}
option = {
name = ep3_admin_events.0002.prosperity
trigger = {
is_landed = yes
government_has_flag = government_has_merit
}
flavor = building_buildings_give_merit_tt
custom_tooltip = ep3_admin_events.0002.tt
add_character_modifier = {
modifier = tgp_diligent_governor_modifier
years = 3
}
stress_impact = {
lazy = medium_stress_impact_gain
diligent = miniscule_stress_impact_loss
}
ai_chance = {
base = 0
}
}
option = {
name = ep3_admin_events.0002.inspection
trigger = {
is_landed = yes
government_has_flag = government_has_merit
any_held_title = {
tier = tier_county
is_landless_type_title = no
count >= 1
}
}
flavor = inspections_give_merit_tt
custom_tooltip = ep3_admin_events.0002.tt
custom_tooltip = ep3_admin_events.0002.tt_inspection
add_character_flag = free_inspection
stress_impact = {
lazy = medium_stress_impact_gain
diligent = miniscule_stress_impact_loss
}
ai_chance = {
base = 0
}
}
option = {
name = ep3_admin_events.0002.a
custom_tooltip = ep3_admin_events.0002.tt
stress_impact = {
base = miniscule_stress_impact_loss
}
}
after = {
if = {
limit = {
is_ai = yes
}
domicile ?= {
move_domicile = root.capital_province
}
}
}
}
# Your admin liege changed government, and you have to do so as well
ep3_admin_events.0003 = {
hidden = yes
trigger = {
government_allows = administrative
}
immediate = {
# Let's evaluate and see which event you should get
if = { # If you are still landed and remain a vassal
limit = {
is_landed = yes
liege != root
}
trigger_event = ep3_admin_events.0001
}
else_if = { # You are still landed and become independent
limit = {
is_landed = yes
liege = root
}
trigger_event = ep3_admin_events.0005
}
else_if = { # You became unlanded - Let's go on an adventure!
limit = { # Assuming you are a player
is_landed = no
}
trigger_event = ep3_admin_events.0004
}
}
}
# Event to make admin into adventurers
ep3_admin_events.0004 = {
type = character_event
title = ep3_admin_events.0004.t
desc = {
desc = ep3_admin_events.0004.desc
first_valid = {
triggered_desc = {
trigger = {
exists = scope:reacting_spouse
scope:reacting_spouse = {
OR = {
has_trait = gluttonous
has_trait = greedy
}
}
}
desc = ep3_admin_events.0004.desc_spouse_very_upset
}
triggered_desc = {
trigger = { exists = scope:reacting_spouse }
desc = ep3_admin_events.0004.desc_spouse_upset
}
}
}
theme = landless_adventurer
override_background = { reference = estate }
left_portrait = {
character = root
triggered_animation = {
trigger = {
OR = {
has_trait = eccentric
has_trait = brave
}
}
#animation = delirium
animation = disappointed
}
animation = disbelief
}
right_portrait = {
character = scope:reacting_spouse
triggered_animation = {
trigger = {
OR = {
has_trait = gluttonous
has_trait = greedy
}
}
animation = crying
}
animation = worry
}
immediate = {
if = { # Destroy your noble family title if you have one
limit = {
any_held_title = {
is_noble_family_title = yes
}
}
every_held_title = {
limit = {
is_noble_family_title = yes
}
save_temporary_scope_as = family_title
prev = { destroy_title = scope:family_title }
}
}
if = { # Become an adventurer
limit = { is_ai = no }
create_landless_adventurer_title_effect = {
REASON = flag:runaway_allowed
FLAVOR_CHAR = root
}
hidden_effect = {
contract_passive_spawn_effect = {
SPAWN_CONTRACTS = 5
}
}
}
if = { # If you are married, let's save your spouse as a scope for some added flavor
limit = {
is_married = yes
any_spouse = {
employer = root
}
}
random_spouse = {
limit = { employer = root }
save_scope_as = reacting_spouse
}
}
}
option = {
name = {
trigger = {
exists = scope:reacting_spouse
scope:reacting_spouse = {
OR = {
has_trait = gluttonous
has_trait = greedy
}
}
}
text = ep3_admin_events.0004.a
}
name = {
trigger = {
exists = scope:reacting_spouse
scope:reacting_spouse = {
NOR = {
has_trait = gluttonous
has_trait = greedy
}
}
}
text = ep3_admin_events.0004.b
}
name = {
trigger = {
NOT = { exists = scope:reacting_spouse }
}
text = ep3_admin_events.0004.c
}
}
}
# Notification event that you became independent
ep3_admin_events.0005 = {
type = character_event
title = ep3_admin_events.0005.t
desc = {
desc = ep3_admin_events.0005.intro
first_valid = {
triggered_desc = {
trigger = { exists = scope:still_admin }
desc = ep3_admin_events.0005.desc_still_admin
}
desc = ep3_admin_events.0005.desc_lost_admin
}
}
theme = administrative
left_portrait = {
character = root
triggered_animation = {
trigger = {
OR = {
has_trait = fickle
has_trait = lazy
has_trait = paranoid
}
}
animation = stress
}
animation = interested
}
right_portrait = {
character = scope:messenger
animation = chancellor
}
lower_right_portrait = scope:gov_liege
immediate = {
# Let's find a character to bring us these news
if = {
limit = {
exists = cp:councillor_chancellor
cp:councillor_chancellor = { is_available_healthy_ai_adult = yes }
}
cp:councillor_chancellor = { save_scope_as = messenger }
}
else_if = {
limit = {
any_courtier = { is_available_healthy_ai_adult = yes }
}
ordered_courtier = {
limit = {
is_available_healthy_ai_adult = yes
}
order_by = diplomacy
save_scope_as = messenger
}
}
else = {
create_character = {
location = root.capital_province
template = diplomacy_foreign_affairs_focus_friend_template
faith = root.capital_county.faith
culture = root.capital_county.culture
save_scope_as = messenger
}
}
# Show this to make it clear to the player that you became independent
show_as_tooltip = {
create_title_and_vassal_change = {
type = independency
save_scope_as = change
add_claim_on_loss = no
}
becomes_independent = { change = scope:change }
resolve_title_and_vassal_change = scope:change
}
if = { # You are allowed to keep admin as your government
limit = {
highest_held_title_tier >= tier_kingdom
culture ?= { has_cultural_parameter = can_adopt_administrative_government_as_kingdom_tier }
}
save_scope_as = still_admin
}
else = { # You change your government
admin_change_government_effect = yes
}
}
option = {
name = ep3_admin_events.0005.a
# We handle everything in the immediate
}
}
# Reception Hall domicile upgrade provides legitimacy
# We put it in a delayed event to make sure that we can notify the player of the effect, so they can see it
ep3_admin_events.0010 = {
hidden = yes
immediate = {
save_scope_as = legitimacy_gainer
# We first send the notification of the legitimacy being granted
house = {
every_house_member = {
limit = { is_ai = no }
send_interface_message = {
type = event_toast_effect_good
title = ep3_dynasty_legacy_gain_legitimacy_effect_title
left_icon = root
right_icon = root.primary_title
show_as_tooltip = {
scope:legitimacy_gainer = { add_legitimacy = house.var:ep3_legacy_legitimacy_counter }
}
}
}
}
# Then we add the actual legitimacy
add_legitimacy = house.var:ep3_legacy_legitimacy_counter
# Finally, let's reset the counter according to building level
house = {
if = {
limit = {
house_head.domicile ?= { has_domicile_parameter = reception_hall_legitimacy_loss_04 }
}
change_variable = {
name = ep3_legacy_legitimacy_counter
multiply = 0.75
}
}
else_if = {
limit = {
house_head.domicile ?= { has_domicile_parameter = reception_hall_legitimacy_loss_03 }
}
change_variable = {
name = ep3_legacy_legitimacy_counter
multiply = 0.5
}
}
else_if = {
limit = {
house_head.domicile ?= { has_domicile_parameter = reception_hall_legitimacy_loss_02 }
}
change_variable = {
name = ep3_legacy_legitimacy_counter
multiply = 0.25
}
}
else_if = {
limit = {
house_head.domicile ?= { has_domicile_parameter = reception_hall_legitimacy_loss_01 }
}
change_variable = {
name = ep3_legacy_legitimacy_counter
multiply = 0
}
}
}
}
}

View file

@ -0,0 +1,332 @@
namespace = ep3_akolouthos_events
# Varangian-eligible courtier gains Varangian or Varangian gains Loyal
ep3_akolouthos_events.1000 = {
hidden = yes
trigger = {
OR = {
# A varangian who isn't loyal
any_courtier = {
has_trait = varangian
NOT = { has_trait = loyal }
}
#An eligible Varangian who doesn't have the trait
any_courtier = {
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
}
weight_multiplier = {
base = 1
modifier = {
add = 1
any_court_position_holder = {
type = bodyguard_court_position
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
modifier = {
add = 1
any_court_position_holder = {
type = bodyguard_court_position
NOT = { has_trait = loyal }
has_trait = varangian
}
}
modifier = {
add = 1
any_court_position_holder = {
type = akolouthos_court_position
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
}
immediate = {
random_court_position_holder = {
type = akolouthos_court_position
save_scope_as = akolouthos
}
#Most important that Varangian Akolouthos becomes Varangian
if = {
limit = {
any_court_position_holder = {
type = akolouthos_court_position
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
random_court_position_holder = {
type = akolouthos_court_position
limit = {
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_varangian = yes
}
#Second-most important: Varangian bodyguard becomes Varangian
else_if = {
limit = {
any_court_position_holder = {
type = bodyguard_court_position
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
random_court_position_holder = {
type = bodyguard_court_position
limit = {
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_varangian = yes
}
#Then either add loyal to a Varangian bodyguard or to Akolouthos
else_if = {
limit = {
OR = {
any_court_position_holder = {
type = bodyguard_court_position
has_trait = varangian
NOT = { has_trait = loyal }
}
any_court_position_holder = {
type = akolouthos_court_position
has_trait = varangian
NOT = { has_trait = loyal }
}
}
}
random_list = {
#Add loyal to a Varangian bodyguard
10 = {
trigger = {
any_court_position_holder = {
type = bodyguard_court_position
has_trait = varangian
NOT = { has_trait = loyal }
}
}
random_court_position_holder = {
type = bodyguard_court_position
limit = {
has_trait = varangian
NOT = { has_trait = loyal }
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_loyal = yes
}
#Add loyal to a Varangian akolouthos
10 = {
trigger = {
any_court_position_holder = {
type = akolouthos_court_position
has_trait = varangian
NOT = { has_trait = loyal }
}
}
random_court_position_holder = {
type = akolouthos_court_position
limit = {
has_trait = varangian
NOT = { has_trait = loyal }
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_loyal = yes
}
}
}
#Add Varangian to some non-Varangian Varangian
else_if = {
limit = {
any_courtier = {
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
}
random_courtier = {
limit = {
NOT = { has_trait = varangian }
ep3_varangian_trigger = yes
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_varangian = yes
}
#Add loyal to some non-bodyguard Varangian
else = {
random_courtier = {
limit = {
has_trait = varangian
NOT = { has_trait = loyal }
}
save_scope_as = trait_getter
}
ep3_send_akolouthos_message_loyal = yes
}
}
}
# Akolouthos recruits Varangian
ep3_akolouthos_events.1001 = {
hidden = yes
trigger = {
#Don't really need this if root is swarming in Varangians already
NOT = {
any_courtier_or_guest = {
count >= 8
ep3_varangian_trigger = yes
}
}
}
weight_multiplier = {
base = 1
#Weigh up chances if Varangians are needed to fill posts
modifier = {
add = 1
NOT = {
any_courtier_or_guest = {
count >= 3
ep3_varangian_trigger = yes
}
}
}
}
immediate = {
random_court_position_holder = {
type = akolouthos_court_position
save_scope_as = akolouthos
}
#Find a candidate in the local pool
if = {
limit = {
is_landed = yes
any_pool_character = {
province = root.capital_province
ep3_varangian_trigger = yes
prowess > low_skill_rating
}
}
random_pool_character = {
province = root.capital_province
limit = {
ep3_varangian_trigger = yes
prowess > low_skill_rating
}
save_scope_as = new_varangian
}
scope:new_varangian = {
if = {
limit = {
NOT = { has_trait = varangian }
}
hidden_effect = {
add_trait = varangian
}
}
}
}
#Find a candidate in pools of akolouthos's culture
else_if = {
limit = {
scope:akolouthos = {
ep3_varangian_trigger = yes
}
exists = scope:akolouthos.culture.culture_head
scope:akolouthos.culture.culture_head = {
is_landed = yes
}
any_pool_character = {
province = scope:akolouthos.culture.culture_head.capital_province
ep3_varangian_trigger = yes
prowess >= low_skill_rating
}
}
scope:akolouthos.culture.culture_head = {
save_scope_as = akolouthos_culture_head
}
random_pool_character = {
province = scope:akolouthos_culture_head.capital_province
limit = {
ep3_varangian_trigger = yes
prowess > low_skill_rating
}
save_scope_as = new_varangian
}
scope:new_varangian = {
if = {
limit = {
NOT = { has_trait = varangian }
}
hidden_effect = {
add_trait = varangian
}
}
}
}
#Create a candidate
else_if = {
limit = {
scope:akolouthos = {
ep3_varangian_trigger = yes
}
}
create_character = {
template = varangian_template
location = root.location
culture = scope:akolouthos.culture
faith = scope:akolouthos.faith
dynasty = none
save_scope_as = new_varangian
}
}
else_if = {
limit = {
current_date < 990
}
#Norse
create_character = {
template = varangian_template
location = root.location
culture = culture:norse
faith = root.faith
dynasty = none
save_scope_as = new_varangian
}
}
else = {
#Anglo-Saxon
create_character = {
template = varangian_template
location = root.location
culture = culture:anglo_saxon
faith = root.faith
dynasty = none
save_scope_as = new_varangian
}
}
send_interface_message = {
type = event_martial_good_with_text
title = ep3_akolouthos_events.1001
desc = ep3_akolouthos_events.1001_notification_tooltip
tooltip = akolouthos_effect_tooltip
left_icon = scope:new_varangian
right_icon = scope:akolouthos
add_courtier = scope:new_varangian
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,173 @@
########################
# EP3 Councillors Events
########################
namespace = ep3_councillor_event
# Spouse increases your Influence
ep3_councillor_event.0001 = {
hidden = yes
cooldown = { years = 10 }
trigger = {
valid_spouse_councillor_trigger = yes
government_allows = administrative
}
weight_multiplier = {
base = 1
councillor_spouse_limited_skill_rating_modifier = {
SKILL = intrigue
SCALE = 1
SKILL_RATING = spouse_skill_rating_1
}
}
immediate = {
cp:councillor_spouse = {
save_scope_as = councillor
}
send_interface_message = {
type = msg_spouse_task_good
title = ep3_councillor_event.0001.t
desc = {
triggered_desc = {
trigger = {
scope:councillor = { diplomacy < average_skill_level }
}
desc = spouse_task_diplomacy_good_unskilled_notification_tooltip
}
triggered_desc = {
trigger = {
scope:councillor = { diplomacy >= average_skill_level }
}
desc = spouse_task_diplomacy_good_skilled_notification_tooltip
}
}
right_icon = scope:councillor
change_influence = {
if = {
limit = {
scope:councillor = {
culture = { has_cultural_tradition = tradition_ep3_palace_politics }
}
}
add = medium_influence_gain
}
else = {
add = minor_influence_gain
}
}
}
}
}
# Spouse increases your candidate score for a title if you are in to inherit
ep3_councillor_event.0002 = {
hidden = yes
cooldown = { years = 10 }
trigger = {
valid_spouse_councillor_trigger = yes
government_allows = administrative
top_liege = {
any_sub_realm_title = {
tier >= tier_duchy
is_noble_family_title = no
holder = { government_allows = administrative }
any_title_heir = {
prev = { # For getting the correct title
place_in_line_of_succession = {
target = prev # And again for going back and getting the correct character
value <= 3
}
}
this = root
}
}
}
}
weight_multiplier = {
base = 1
councillor_spouse_limited_skill_rating_modifier = {
SKILL = diplomacy
SCALE = 1
SKILL_RATING = spouse_skill_rating_1
}
}
immediate = {
cp:councillor_spouse = {
save_scope_as = councillor
}
top_liege = {
random_sub_realm_title = {
limit = {
tier >= tier_duchy
is_noble_family_title = no
holder = { government_allows = administrative }
any_title_heir = {
prev = {
place_in_line_of_succession = {
target = prev
value <= 3
}
}
this = root
}
}
save_scope_as = target_title
}
}
save_scope_value_as = {
name = improved_candidate_score
value = {
if = {
limit = {
scope:councillor = {
culture = { has_cultural_tradition = tradition_ep3_palace_politics }
}
}
add = 15
}
else = {
add = 10
}
}
}
send_interface_message = {
type = msg_spouse_task_good
title = ep3_councillor_event.0002.t
desc = {
triggered_desc = {
trigger = {
scope:councillor = { diplomacy < average_skill_level }
}
desc = spouse_task_diplomacy_good_unskilled_notification_tooltip
}
triggered_desc = {
trigger = {
scope:councillor = { diplomacy >= average_skill_level }
}
desc = spouse_task_diplomacy_good_skilled_notification_tooltip
}
}
right_icon = scope:councillor
left_icon = scope:target_title
custom_tooltip = ep3_councillor_event.0002.desc
scope:target_title = {
change_appointment_investment = {
target = root
value = scope:improved_candidate_score
}
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,328 @@
namespace = ep3_laamp_flavor_oltner
scripted_trigger suitable_pool_marriage_trigger = {
save_temporary_scope_as = pool_marriage_target
is_physically_able_adult = yes
allowed_to_marry_character_gender_trigger = { CHARACTER = $FOLLOWER_TARGET$ }
$FOLLOWER_TARGET$ ?= { allowed_to_marry_character_gender_trigger = { CHARACTER = prev } }
are_characters_sensible_lovers_trigger = { INSTIGATING_LOVER = $FOLLOWER_TARGET$ TARGET_OF_LOVE = scope:pool_marriage_target }
is_married = no
can_marry_trigger = yes
is_concubine = no
NOT = {
exists = betrothed
}
has_no_particular_noble_roots_trigger = yes
}
scripted_trigger suitable_follower_marriage_character_trigger = {
is_physically_able_adult = yes
this != root
is_married = no
can_marry_trigger = yes
is_concubine = no
age <= 50
health >= fine_health
NOR = {
house = root.house
is_close_family_of = root
exists = betrothed
has_relation_rival = root
}
save_temporary_scope_as = entourage_member
any_pool_character = {
province = root.location
age <= 40
health >= fine_health
suitable_pool_marriage_trigger = { FOLLOWER_TARGET = scope:entourage_member }
}
}
# A Follower's Heart
ep3_laamp_flavor_oltner.0001 = {
type = character_event
title = ep3_laamp_flavor_oltner.3001.t
desc = ep3_laamp_flavor_oltner.3001.desc
theme = marriage
override_background = { reference = market_scope }
left_portrait = {
character = scope:entourage_to_marry_2
animation = beg
camera = camera_event_very_left
}
right_portrait = {
character = scope:marriage_material
animation = dismissal
camera = camera_event_right_pointing_left
}
cooldown = { years = 10 }
trigger = {
has_government = landless_adventurer_government
location = {
has_holding = yes
}
any_courtier = {
suitable_follower_marriage_character_trigger = yes
}
}
immediate = {
save_scope_as = root_char
random_courtier = {
limit = {
suitable_follower_marriage_character_trigger = yes
}
save_scope_as = entourage_to_marry_2
}
random_pool_character = {
province = root.location
limit = {
suitable_pool_marriage_trigger = { FOLLOWER_TARGET = scope:entourage_to_marry_2 }
}
save_scope_as = marriage_material
}
location.county.title_province = { save_scope_as = background_market_scope }
}
option = { # Tell them to pay it themselves
name = ep3_laamp_flavor_oltner.0001.a
trigger = {
scope:entourage_to_marry_2.gold >= {
add = scope:marriage_material.sum_of_all_skills_and_prowess_value
}
}
scope:entourage_to_marry_2 = {
remove_short_term_gold = {
add = scope:marriage_material.sum_of_all_skills_value
add = scope:marriage_material.prowess
}
}
add_courtier = scope:marriage_material
scope:entourage_to_marry_2 = {
if = {
limit = {
is_female = yes
is_lowborn = no
scope:marriage_material = {
is_lowborn = yes
}
}
marry_matrilineal = scope:marriage_material
}
else_if = {
limit = {
is_male = yes
is_lowborn = yes
scope:marriage_material = {
is_lowborn = no
}
}
marry_matrilineal = scope:marriage_material
}
else = {
marry = scope:marriage_material
}
}
ai_chance = {
base = 100
}
}
option = { # Pay the dowry
name = ep3_laamp_flavor_oltner.0001.b
stress_impact = {
generous = massive_stress_impact_loss
greedy = medium_stress_impact_gain
}
remove_short_term_gold = {
add = scope:marriage_material.sum_of_all_skills_and_prowess_value
}
add_courtier = scope:marriage_material
scope:entourage_to_marry_2 = {
if = {
limit = {
is_female = yes
is_lowborn = no
scope:marriage_material = {
is_lowborn = yes
}
}
marry_matrilineal = scope:marriage_material
}
else_if = {
limit = {
is_male = yes
is_lowborn = yes
scope:marriage_material = {
is_lowborn = no
}
}
marry_matrilineal = scope:marriage_material
}
else = {
marry = scope:marriage_material
}
progress_towards_friend_effect = {
CHARACTER = root
OPINION = 0
REASON = friend_helped_me_marry
}
add_opinion = {
target = root
modifier = grateful_opinion
opinion = 50
}
}
scope:marriage_material = { save_scope_as = relationship_reason_involved_character }
clear_saved_scope = relationship_reason_involved_character
ai_chance = {
base = 10
modifier = {
factor = 0
OR = {
has_trait = greedy
gold <= {
add = scope:marriage_material.sum_of_all_skills_and_prowess_value
multiply = 2
}
}
}
}
}
option = { # Convince them to run away with you
name = ep3_laamp_flavor_oltner.0001.c
skill = intrigue
stress_impact = {
generous = medium_stress_impact_gain
}
duel = {
skill = intrigue
value = high_skill_rating
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = ep3_laamp_flavor_oltner.0001.c.success
send_interface_toast = {
title = ep3_laamp_flavor_oltner.0001.c.success
left_icon = scope:entourage_to_marry_2
right_icon = scope:marriage_material
add_courtier = scope:marriage_material
scope:entourage_to_marry_2 = {
if = {
limit = {
is_female = yes
is_lowborn = no
scope:marriage_material = {
is_lowborn = yes
}
}
marry_matrilineal = scope:marriage_material
}
else_if = {
limit = {
is_male = yes
is_lowborn = yes
scope:marriage_material = {
is_lowborn = no
}
}
marry_matrilineal = scope:marriage_material
}
else = {
marry = scope:marriage_material
}
progress_towards_friend_effect = {
CHARACTER = root
OPINION = 0
REASON = friend_helped_me_marry
}
add_opinion = {
target = root
modifier = grateful_opinion
opinion = 50
}
}
scope:marriage_material = { save_scope_as = relationship_reason_involved_character }
clear_saved_scope = relationship_reason_involved_character
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = ep3_laamp_flavor_oltner.0001.c.failure
send_interface_toast = {
title = ep3_laamp_flavor_oltner.0001.c.failure
left_icon = scope:entourage_to_marry_2
right_icon = scope:marriage_material
scope:entourage_to_marry_2 = {
add_stress = medium_stress_gain
add_opinion = {
target = root
modifier = disappointed_opinion
opinion = -30
}
}
}
}
}
ai_chance = {
base = 10
modifier = {
factor = 0
has_trait = generous
}
}
}
option = { # Ignore your follower
name = ep3_laamp_flavor_oltner.0001.d
stress_impact = {
compassionate = medium_stress_impact_gain
generous = medium_stress_impact_gain
callous = minor_stress_impact_loss
sadistic = minor_stress_impact_loss
chaste = minor_stress_impact_loss
shy = minor_stress_impact_loss
}
scope:entourage_to_marry_2 = {
add_opinion = {
target = root
modifier = heartbroken_opinion
opinion = -30
}
}
ai_chance = {
base = 10
modifier = {
factor = 0
OR = {
has_trait = compassionate
has_trait = generous
}
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,521 @@
namespace = ep3_roman_restoration
#######################################
###
### EP3 RESTORE ROME STORY CYCLE EVENTS
### by Chad Uhl
###
### 0100 Justinian's Dream
### 0101-0109 Rome Reformed Notifications
### 0300-0590 Post-Restoration Difficulties
###
#######################################
# Justinian's Dream
# Event fired on story cycle setup informing the player that they can form the roman empire
ep3_roman_restoration.0001 = {
type = character_event
title = ep3_roman_restoration.0001.t
desc = ep3_roman_restoration.0001.desc
theme = emperor
override_background = {
trigger = { capital_county = title:c_byzantion }
reference = ep3_constantinople
}
left_portrait = {
character = root
animation = emotion_thinking_scepter
}
trigger = {
NOT = { has_global_variable = flag_restored_roman_empire }
}
option = {
name = ep3_roman_restoration.0001.a
custom_tooltip = ep3_roman_restoration.0001.a.tt
decision:restore_roman_empire_decision = {
open_view_data = {
view = decision_detail
player = root
}
}
}
}
# Should I LARP or nah?
ep3_roman_restoration.0100 = {
type = character_event
window = fullscreen_event
title = ep3_roman_restoration.0100.t
desc = ep3_roman_restoration.0100.desc
theme = emperor
override_background = { reference = ep3_fullscreen_restore_rome }
immediate = {
save_scope_as = scoped_emperor
}
option = { # LARP (Hard Mode)
name = ep3_roman_restoration.0100.a
custom_tooltip = ep3_roman_restoration.hard_mode
custom_tooltip = ep3_roman_restoration.end_hard_mode
custom_tooltip = ep3_roman_restoration.invasion_cb
every_held_title = {
limit = {
is_head_of_faith = yes
}
root = {
destroy_title = prev
}
}
set_character_faith = faith:hellenic_pagan
primary_title = { set_state_faith = faith:hellenic_pagan }
every_held_title = {
custom = custom.every_held_county
title_tier = county
set_county_faith = faith:hellenic_pagan
}
every_vassal = {
custom = custom.every_vassal
limit = {
NOT = {
any_held_title = {
is_head_of_faith = yes # you cannot convert the Ecumenical Patriarch, sorry
}
}
}
custom_tooltip = {
text = may_choose_to_convert_hellenic_desc
run_interaction = { # We use the same interaction as when creating a new faith to keep a consistent behaviour, since that is essentially what you're doing here
interaction = ask_for_conversion_interaction
actor = root
recipient = this
execute_threshold = accept
}
}
}
custom_tooltip = {
text = ep3_roman_restoration.household_gods_tenet
set_global_variable = household_gods_tenet_unlocked
}
custom_tooltip = {
text = uses_custom_caesar_flavourization_tt
set_variable = uses_custom_caesar_flavourization
}
if = {
limit = {
any_owned_story = { type = ep3_story_cycle_restoring_rome }
}
random_owned_story = {
type = ep3_story_cycle_restoring_rome
set_variable = roman_empire_hard_mode
}
}
}
option = { # Roleplay option (become Hellenic without Hard Mode)
name = ep3_roman_restoration.0100.c
custom_tooltip = ep3_roman_restoration.easy_mode
every_held_title = {
limit = {
is_head_of_faith = yes
}
root = {
destroy_title = prev
}
}
set_character_faith = faith:hellenic_pagan
primary_title = { set_state_faith = faith:hellenic_pagan }
every_held_title = {
custom = custom.every_held_county
title_tier = county
set_county_faith = faith:hellenic_pagan
}
every_vassal = {
custom = custom.every_vassal
limit = {
NOT = {
any_held_title = {
is_head_of_faith = yes # you cannot convert the Ecumenical Patriarch, sorry
}
}
}
custom_tooltip = {
text = may_choose_to_convert_hellenic_desc
run_interaction = { # We use the same interaction as when creating a new faith to keep a consistent behaviour, since that is essentially what you're doing here
interaction = ask_for_conversion_interaction
actor = root
recipient = this
execute_threshold = accept
}
}
}
custom_tooltip = {
text = ep3_roman_restoration.household_gods_tenet
set_global_variable = household_gods_tenet_unlocked
}
custom_tooltip = {
text = uses_custom_caesar_flavourization_tt
set_variable = uses_custom_caesar_flavourization
}
}
option = { # Easy Mode
name = ep3_roman_restoration.0100.b
custom_tooltip = ep3_roman_restoration.easy_mode
}
after = {
create_roman_empire_scripted_effect = yes
set_nickname_effect = { NICKNAME = nick_the_glorious }
# Send narrative fluff to other players (if any).
every_player = {
limit = { this != root }
trigger_event = ep3_roman_restoration.0101
}
}
}
# Some chucklefuck restored Rome
ep3_roman_restoration.0101 = {
type = character_event
window = fullscreen_event
title = roman_restoration.0002.t
desc = {
desc = ep3_roman_restoration.0101.intro
first_valid = {
triggered_desc = {
trigger = { scope:scoped_emperor.primary_title.state_faith ?= faith:hellenic_pagan }
desc = ep3_roman_restoration.0101.hellenic
}
triggered_desc = {
trigger = { scope:scoped_emperor.primary_title.state_faith ?= faith:orthodox }
desc = ep3_roman_restoration.0101.orthodox
}
desc = ep3_roman_restoration.0101.fallback
}
desc = ep3_roman_restoration.0101.outro
}
theme = emperor
override_background = { reference = ep3_fullscreen_restore_rome }
immediate = {
#Same-faith non-empire tier rulers are over-awed.
if = {
limit = { faith = scope:scoped_emperor.primary_title.state_faith }
play_music_cue = "mx_cue_epic_sacral_moment"
}
#Otherwise, this is a tacit statement of imperial threat.
else = { play_music_cue = "mx_cue_combat_2" }
}
option = {
name = ep3_roman_restoration.0101.a
}
}
#######################################
### POST-ROME DIFFICULTIES
# Your inefficient governor messed up, causing mass loss in popular opinion. Can you fix it?
ep3_roman_restoration.0300 = {
type = character_event
title = ep3_roman_restoration.0300.t
desc = ep3_roman_restoration.0300.desc
theme = emperor
left_portrait = {
character = root
animation = anger
}
right_portrait = {
character = scope:inefficient_governor
animation = shock
}
cooldown = { years = 20 }
immediate = {
ordered_vassal = {
limit = {
is_governor = yes
is_ai = yes
}
order_by = { # Mostly sort by governor efficiency
value = governor_efficiency
multiply = -10
# Prefer governors with a larger realm size for more difficulty
add = sub_realm_size
}
save_scope_as = inefficient_governor
}
custom_tooltip = ep3_roman_restoration.0300.efficiency
}
option = { # Stewardship Challenge
name = ep3_roman_restoration.0300.a
duel = {
skill = stewardship
value = excellent_skill_level
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
send_interface_toast = {
type = event_toast_effect_good
title = ep3_roman_restoration.0300.a.success
left_icon = scope:inefficient_governor
right_icon = scope:inefficient_governor.primary_title
scope:inefficient_governor = {
every_sub_realm_county = {
custom = ep3_roman_restoration.0300.every_sub_realm_county
add_county_modifier = {
modifier = restore_rome_recuperated_county_opinion_modifier
years = 10
}
}
}
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
send_interface_toast = {
type = event_toast_effect_bad
title = ep3_roman_restoration.0300.a.failure
left_icon = scope:inefficient_governor
right_icon = scope:inefficient_governor.primary_title
scope:inefficient_governor = {
every_sub_realm_county = {
custom = ep3_roman_restoration.0300.every_sub_realm_county
add_county_modifier = {
modifier = restore_rome_devastated_county_opinion_modifier
years = 10
}
}
}
}
}
}
}
option = { # Fire the Governor
name = ep3_roman_restoration.0300.b
change_influence = massive_influence_loss
save_scope_as = actor
scope:inefficient_governor = {
save_scope_as = recipient
primary_title = { save_scope_as = landed_title }
}
save_scope_value_as = {
name = hook
value = no
}
scope:inefficient_governor = {
every_sub_realm_county = {
custom = ep3_roman_restoration.0300.every_sub_realm_county
add_county_modifier = {
modifier = restore_rome_recuperated_county_opinion_modifier
years = 10
}
}
force_step_down_landed_titles = yes
}
}
option = { # Opt-Out
name = ep3_roman_restoration.0300.c
scope:inefficient_governor = {
every_sub_realm_county = {
custom = ep3_roman_restoration.0300.every_sub_realm_county
add_county_modifier = {
modifier = restore_rome_lowered_county_opinion_modifier
years = 10
}
}
}
stress_impact = {
base = medium_stress_impact_loss
lazy = minor_stress_impact_loss
diligent = medium_stress_impact_gain
ambitious = minor_stress_impact_gain
}
}
}
# Every 10-30 years, a random kingdom will raid you
ep3_roman_restoration.0500 = {
type = character_event
title = ep3_roman_restoration.0500.t
desc = ep3_roman_restoration.0500.desc
theme = emperor
left_portrait = {
character = root
animation = emotion_thinking_scepter
}
right_portrait = {
character = scope:marshal
animation = inspect_weapon
}
lower_center_portrait = scope:target_kingdom
cooldown = { years = { 10 30 } }
trigger = {
exists = cp:councillor_marshal
any_neighboring_top_liege_realm_owner = {
is_ai = yes
is_at_war = no
primary_title = { tier >= tier_kingdom }
NOR = {
is_allied_to = root
any_truce_target = { this = root }
has_relation_friend = root
has_relation_lover = root
}
any_top_realm_border_county = {
any_neighboring_county = {
holder.top_liege = root
NOT = {
title_province = { has_province_modifier = recently_looted_modifier }
}
}
}
}
}
immediate = {
cp:councillor_marshal = { save_scope_as = marshal }
ordered_neighboring_top_liege_realm_owner = {
limit = {
is_ai = yes
is_at_war = no
primary_title = { tier >= tier_kingdom }
any_top_realm_border_county = {
any_neighboring_county = {
holder.top_liege = root
NOT = {
title_province = { has_province_modifier = recently_looted_modifier }
}
}
}
}
order_by = {
value = 1
add = { # inverted opinion since we're looking for ppl who hate you
value = "opinion(root)"
multiply = -1
}
if = {
limit = { can_raid_trigger = yes }
add = 50
}
}
save_scope_as = target_kingdom
}
scope:target_kingdom = {
random_top_realm_border_county = {
limit = {
any_neighboring_county = {
holder.top_liege = root
NOT = {
title_province = { has_province_modifier = recently_looted_modifier }
}
}
}
random_neighboring_county = {
limit = {
holder.top_liege = root
NOT = {
title_province = { has_province_modifier = recently_looted_modifier }
}
}
save_scope_as = target_county
}
}
}
}
option = {
name = ep3_roman_restoration.0500.a
}
after = {
scope:target_kingdom = {
start_war = {
cb = ep3_roman_empire_border_war
target = root
target_title = scope:target_county
}
}
}
}
# Special Bubonic Plague Spawns - Commented out and disabled because this is not very fun
#ep3_roman_restoration.0510 = {
# hidden = yes
#
# immediate = {
# random_realm_county = {
# limit = { exists = holder }
# holder = { save_scope_as = target_holder }
# save_scope_as = infected_county
# title_province = {
# save_scope_as = target_province
# create_epidemic_outbreak = {
# type = bubonic_plague
# intensity = major
# save_scope_as = epidemic
# }
# }
# }
# trigger_event = epidemic_events.1100
# }
#}
# Mongol Invasion Spawns
ep3_roman_restoration.0520 = {
scope = none
hidden = yes
trigger = {
NOR = {
has_global_variable = mongols_have_appeared
any_player = {
THIS = culture:mongol.culture_head
realm_size >= 100
}
}
}
immediate = {
set_global_variable = {
name = mongols_have_appeared
value = yes
}
debug_log = "Mongols appeared!"
debug_log_date = yes
spawn_temujin_character_effect = yes
scope:temujin = {
save_scope_as = story_owner
create_story = story_mongol_invasion
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,528 @@
namespace = ep3_travel_events
##################################################
# EP3 Travel Events
# by James Beaumont
#
# 8000-8009 To Belong Somewhere
scripted_trigger ep3_travel_8000_valid_prince = {
is_courtier_of = $PARENT$
is_adult = yes
age <= 25
is_married = no
could_marry_character_trigger = { CHARACTER = $CHILD$ }
save_temporary_scope_as = temp_prospective_prince
matching_gender_and_sexuality_trigger = {
CHARACTER_1 = scope:temp_prospective_prince
CHARACTER_2 = $CHILD$
}
trait_compatibility = {
target = $CHILD$
value >= medium_positive_trait_compatibility
}
}
scripted_effect ep3_travel_8000_a = {
scope:prince_parent = { add_courtier = scope:romantic_child }
marry_on_realm_law = {
SPOUSE_1 = scope:prospective_prince
SPOUSE_2 = scope:romantic_child
}
}
# To Belong Somewhere
# Young adult child falls in love and wants to stop travelling with you
ep3_travel_events.8000 = {
type = character_event
title = ep3_travel_events.8000.t
desc = {
desc = ep3_travel_events.8000.desc.intro
first_valid = {
triggered_desc = {
trigger = {
scope:romantic_child = {
ai_boldness >= medium_positive_ai_value
}
}
desc = ep3_travel_events.8000.desc.mid2.bold_child
}
desc = ep3_travel_events.8000.desc.mid2.timid_child
}
first_valid = {
triggered_desc = {
trigger = {
OR = {
has_relation_rival = scope:romantic_child
opinion = {
target = scope:romantic_child
value = low_negative_opinion
}
}
}
desc = ep3_travel_events.8000.outro.dislikes_child
}
desc = ep3_travel_events.8000.outro
}
}
theme = travel
left_portrait = {
character = root
triggered_animation = {
trigger = {
OR = {
has_trait = callous
has_trait = sadistic
has_trait = family_first
has_trait = diligent
has_trait = stubborn
}
}
animation = anger
}
triggered_animation = {
trigger = {
OR = {
has_trait = compassionate
has_trait = gallant
}
}
animation = wedding_happy_cry
}
animation = worry
}
right_portrait = {
character = scope:romantic_child
triggered_animation = {
trigger = {
ai_boldness >= medium_positive_ai_value
}
animation = beg
}
triggered_animation = {
trigger = {
ai_boldness < medium_positive_ai_value
}
animation = sadness
}
}
lower_right_portrait = {
character = scope:prospective_prince
}
cooldown = { years = 75 }
trigger = {
has_government = landless_adventurer_government
is_available_travelling = yes
is_location_valid_for_travel_event_on_land = yes
root.location.county.holder = { save_temporary_scope_as = temp_prince_parent }
any_child = {
is_courtier_of = root
is_adult = yes
age <= 25 # An adult but still young
save_temporary_scope_as = temp_child
scope:temp_prince_parent = {
any_child = {
ep3_travel_8000_valid_prince = {
PARENT = scope:temp_prince_parent
CHILD = scope:temp_child
}
}
}
}
}
immediate = {
save_scope_as = laamp
location = {
save_scope_as = location
county.holder = { save_scope_as = prince_parent }
}
random_child = {
limit = {
is_courtier_of = root
is_adult = yes
age <= 25
save_temporary_scope_as = temp_child
scope:prince_parent = {
any_child = {
ep3_travel_8000_valid_prince = {
PARENT = scope:prince_parent
CHILD = scope:temp_child
}
}
}
}
save_scope_as = romantic_child
scope:prince_parent = {
random_child = {
limit = {
ep3_travel_8000_valid_prince = {
PARENT = scope:prince_parent
CHILD = scope:romantic_child
}
}
save_scope_as = prospective_prince
}
}
}
scope:romantic_child = {
set_relation_soulmate = {
target = scope:prospective_prince
reason = soulmate_laamp_adventure
}
}
}
# Goodbye Susan
option = {
name = ep3_travel_events.8000.a
show_as_tooltip = {
ep3_travel_8000_a = yes
}
hidden_effect = {
scope:prince_parent = {
trigger_event = {
id = ep3_travel_events.8001
days = 1
}
}
}
scope:romantic_child = {
progress_towards_friend_effect = {
CHARACTER = root
OPINION = 50
REASON = friend_let_me_go
}
}
stress_impact = {
callous = minor_stress_impact_gain
sadistic = minor_stress_impact_gain
family_first = minor_stress_impact_gain
diligent = minor_stress_impact_gain
stubborn = minor_stress_impact_gain
content = minor_stress_impact_loss
compassionate = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = -1.5
ai_compassion = 1.5
}
}
}
# Convince the young prince/princess to come with you!
option = {
name = ep3_travel_events.8000.b
trigger = {
scope:prince_parent = { is_ai = yes }
has_trait = eccentric
}
add_courtier = scope:prospective_prince
marry_spouse_1_dominant = {
SPOUSE_1 = scope:romantic_child
SPOUSE_2 = scope:prospective_prince
}
scope:prince_parent = {
progress_towards_rival_effect = {
CHARACTER = root
OPINION = -50
REASON = rival_laamp_stole_my_child
}
}
scope:romantic_child = {
progress_towards_friend_effect = {
CHARACTER = root
OPINION = 50
REASON = friend_let_me_go
}
}
stress_impact = {
content = minor_stress_impact_gain
honest = minor_stress_impact_gain
gallant = minor_stress_impact_gain
compassionate = minor_stress_impact_loss
deceitful = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = -1.5
ai_vengefulness = 1.5
ai_compassion = 1.5
}
}
}
# Come along now child
option = {
name = ep3_travel_events.8000.c
if = {
limit = {
scope:romantic_child = {
ai_boldness >= medium_positive_ai_value
}
}
reverse_add_opinion = {
target = scope:romantic_child
modifier = hate_opinion
opinion = -25
}
}
else = {
reverse_add_opinion = {
target = scope:romantic_child
modifier = disappointed_opinion
opinion = -10
}
}
stress_impact = {
content = minor_stress_impact_gain
honest = minor_stress_impact_gain
gallant = minor_stress_impact_gain
compassionate = minor_stress_impact_loss
deceitful = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 1.5
ai_vengefulness = 1.5
ai_compassion = -1.5
}
}
}
}
# Roots of My Own
# Holder response
ep3_travel_events.8001 = {
type = character_event
title = ep3_travel_events.8001.t
desc = ep3_travel_events.8001.desc
theme = family
left_portrait = {
character = root
triggered_animation = {
trigger = {
OR = {
has_trait = callous
has_trait = sadistic
has_trait = family_first
has_trait = diligent
has_trait = stubborn
}
}
animation = anger
}
triggered_animation = {
trigger = {
OR = {
has_trait = compassionate
has_trait = gallant
}
}
animation = wedding_happy_cry
}
animation = worry
}
right_portrait = {
character = scope:prospective_prince
animation = beg
}
lower_right_portrait = {
character = scope:romantic_child
}
immediate = {
show_as_tooltip = {
scope:romantic_child = {
set_relation_soulmate = {
target = scope:prospective_prince
reason = soulmate_laamp_adventure
}
}
}
}
# A fine match!
option = {
name = ep3_travel_events.8001.a
ep3_travel_8000_a = yes
stress_impact = {
callous = minor_stress_impact_gain
sadistic = minor_stress_impact_gain
family_first = minor_stress_impact_gain
diligent = minor_stress_impact_gain
stubborn = minor_stress_impact_gain
content = minor_stress_impact_loss
compassionate = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = -1.5
ai_compassion = 1.5
}
}
}
# I forbid this wedding!
option = {
name = ep3_travel_events.8001.b
if = {
limit = {
scope:prospective_prince = {
ai_boldness >= medium_positive_ai_value
}
}
reverse_add_opinion = {
target = scope:prospective_prince
modifier = hate_opinion
opinion = -25
}
}
else = {
reverse_add_opinion = {
target = scope:prospective_prince
modifier = disappointed_opinion
opinion = -10
}
}
hidden_effect = {
scope:laamp = {
trigger_event = {
id = ep3_travel_events.8002
days = 1
}
}
}
stress_impact = {
content = minor_stress_impact_gain
honest = minor_stress_impact_gain
gallant = minor_stress_impact_gain
compassionate = minor_stress_impact_loss
deceitful = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 1.5
ai_vengefulness = 1.5
ai_compassion = -1.5
}
}
}
}
# In Another Time
# Laamp notification
ep3_travel_events.8002 = {
type = character_event
title = ep3_travel_events.8002.t
desc = ep3_travel_events.8002.desc
theme = family
left_portrait = {
character = root
animation = disappointed
}
right_portrait = {
character = scope:romantic_child
animation = grief
}
# I'm sorry my dear
option = {
name = ep3_travel_events.8002.a
reverse_add_opinion = {
target = scope:romantic_child
modifier = love_opinion
opinion = 25
}
}
}
# Won't Be Missed
# Do some graverobbing?
ep3_travel_events.8010 = {
type = character_event
title = ep3_travel_events.8010.t
desc = ep3_travel_events.8010.desc
theme = travel
left_portrait = {
character = root
animation = survey
}
override_background = { reference = ce1_catacombs }
cooldown = { years = 15 }
trigger = {
is_landless_ruler = yes
is_available_travelling = yes
location = { has_holding = no }
is_location_valid_for_travel_event_on_land = yes
}
immediate = {
location = { save_scope_as = location }
}
# Oh boy, goodies!
option = {
name = ep3_travel_events.8010.a
duel = {
skill = intrigue
value = medium_skill_rating
25 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
min = 5
send_interface_toast = {
title = ep3_travel_events.8010.a.win
left_icon = root
add_gold = medium_gold_value
}
}
25 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
min = 5
send_interface_toast = {
title = ep3_travel_events.8010.a.lose
left_icon = root
reverse_add_opinion = {
target = location.county.holder
modifier = graverobber_opinion
years = 20
}
}
}
}
stress_impact = {
eccentric = medium_stress_impact_gain
lazy = minor_stress_impact_gain
ambitious = minor_stress_impact_loss
}
ai_chance = {
base = 100
ai_value_modifier = {
ai_boldness = 1.5
ai_rationality = 1.5
ai_greed = 1.5
}
}
}
# I'm not risking that!
option = {
name = ep3_travel_events.8010.b
stress_impact = {
content = minor_stress_impact_loss
ambitious = minor_stress_impact_gain
}
add_piety = miniscule_piety_gain
ai_chance = {
base = 100
ai_value_modifier = {
ai_boldness = -1.5
ai_rationality = -1.5
ai_greed = -1.5
}
}
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,267 @@
namespace = ep3_yearly
scripted_effect transfer_warhorse_story_effect = {
$OWNER$ = {
random_owned_story = {
type = story_cycle_martial_lifestyle_warhorse
make_story_owner = $TARGET$
}
}
$TARGET$ = {
add_character_modifier = { modifier = horse_story_modifier }
add_character_flag = had_warhorse_story
set_variable = {
name = warhorse_modifier_level
value = $OWNER$.var:warhorse_modifier_level
}
}
$OWNER$ = {
hidden_effect = {
remove_character_modifier = horse_story_modifier
remove_variable = warhorse_modifier_level
}
}
}
# Jealous of another governor with the Warhorse event chain
ep3_yearly.1010 = {
type = character_event
title = ep3_yearly.1010.t
desc = {
desc = ep3_yearly.1010.intro
triggered_desc = {
trigger = { culture = culture:greek }
desc = ep3_yearly.1010.greek_flavor
}
desc = ep3_yearly.1010.outro
}
theme = administrative
override_background = { reference = courtyard }
left_portrait = {
character = root
animation = thinking
}
right_portrait = {
character = scope:horse_owner
animation = jockey_walk
camera = camera_event_horse_right
}
lower_left_portrait = cp:councillor_spymaster
trigger = {
is_ai = no
is_governor = yes
NOT = { owns_story_of_type = story_cycle_martial_lifestyle_warhorse }
liege = {
any_vassal = {
this != root
is_available_ai_adult = yes
is_governor = yes
any_owned_story = {
type = story_cycle_martial_lifestyle_warhorse
exists = var:horse_gender
exists = var:story_cycle_horse_name
}
}
}
}
immediate = {
liege = {
random_vassal = {
limit = {
this != root
is_available_ai_adult = yes
owns_story_of_type = story_cycle_martial_lifestyle_warhorse
}
save_scope_as = horse_owner
}
}
cp:councillor_spymaster ?= { save_scope_as = spymaster }
}
option = { # Offer to buy the horse
name = ep3_yearly.1010.a
show_as_unavailable = {
gold >= 75
}
random_list = {
50 = {
show_chance = no
desc = ep3_yearly.1010.a.tt.success
send_interface_toast = {
type = event_toast_effect_good
title = ep3_yearly.1010.a.tt.success
left_icon = root
right_icon = scope:horse_owner
remove_short_term_gold = major_gold_value
custom_tooltip = ep3_yearly.1010.tt
transfer_warhorse_story_effect = {
OWNER = scope:horse_owner
TARGET = root
}
}
}
50 = {
show_chance = no
desc = ep3_yearly.1010.a.tt.failure
send_interface_toast = {
type = event_toast_effect_bad
title = ep3_yearly.1010.a.tt.failure
left_icon = root
right_icon = scope:horse_owner
change_influence = medium_influence_loss
add_prestige = medium_prestige_loss
}
}
}
}
option = { # Convince the governor that you deserve the horse because of your influence
name = ep3_yearly.1010.b
change_influence = massive_influence_loss
if = {
limit = { influence_level >= 3 }
transfer_warhorse_story_effect = {
OWNER = scope:horse_owner
TARGET = root
}
}
else = {
duel = {
skill = diplomacy
value = high_skill_rating
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = ep3_yearly.1010.b.tt.success
send_interface_toast = {
type = event_toast_effect_good
title = ep3_yearly.1010.b.tt.success
left_icon = root
right_icon = scope:horse_owner
custom_tooltip = ep3_yearly.1010.tt
transfer_warhorse_story_effect = {
OWNER = scope:horse_owner
TARGET = root
}
add_diplomacy_lifestyle_xp = medium_lifestyle_xp
}
}
50 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = ep3_yearly.1010.b.tt.failure
send_interface_toast = {
type = event_toast_effect_bad
title = ep3_yearly.1010.b.tt.failure
left_icon = root
right_icon = scope:horse_owner
}
}
}
}
}
option = { # Ask your spymaster to steal the horse for you
trigger = { exists = cp:councillor_spymaster }
name = ep3_yearly.1010.c
flavor = ep3_yearly.1010.c.flavor
cp:councillor_spymaster = {
duel = {
skill = intrigue
value = scope:horse_owner.intrigue
40 = {
compare_modifier = {
value = scope:duel_value
multiplier = 3.5
min = -49
}
desc = ep3_yearly.1010.c.tt.success
root = {
send_interface_toast = {
type = event_toast_effect_good
title = ep3_yearly.1010.c.tt.success
left_icon = root
right_icon = scope:horse_owner
custom_tooltip = ep3_yearly.1010.tt
transfer_warhorse_story_effect = {
OWNER = scope:horse_owner
TARGET = root
}
add_intrigue_lifestyle_xp = medium_lifestyle_xp
}
}
}
60 = {
compare_modifier = {
value = scope:duel_value
multiplier = -3.5
min = -49
}
desc = ep3_yearly.1010.c.tt.failure
root = {
send_interface_toast = {
type = event_toast_effect_bad
title = ep3_yearly.1010.c.tt.failure
left_icon = root
right_icon = scope:horse_owner
progress_towards_rival_effect = {
REASON = rival_lands_stolen
CHARACTER = scope:horse_owner
OPINION = default_rival_opinion
}
}
}
}
}
}
}
option = { # If I can't have it, neither can you
name = ep3_yearly.1010.d
flavor = ep3_yearly.1010.d.tt
random_list = {
50 = {
desc = ep3_yearly.1010.d.success
send_interface_toast = {
type = event_toast_effect_good
title = ep3_yearly.1010.d.success
custom_tooltip = ep3_yearly.1010.d.dead_horse
scope:horse_owner = {
random_owned_story = {
type = story_cycle_martial_lifestyle_warhorse
end_story = yes
}
}
}
}
50 = {
desc = ep3_yearly.1010.d.failure
send_interface_toast = {
type = event_toast_effect_bad
title = ep3_yearly.1010.d.failure
custom_tooltip = ep3_yearly.1010.d.dead_horse
scope:horse_owner = {
random_owned_story = {
type = story_cycle_martial_lifestyle_warhorse
end_story = yes
}
}
progress_towards_rival_effect = {
REASON = rival_lands_stolen
CHARACTER = scope:horse_owner
OPINION = default_rival_opinion
}
}
}
}
}
}

View file

@ -0,0 +1,9 @@
namespace = ep3_yearly
ep3_yearly.3000 = {
hidden = yes
immediate = {
ep3_ai_castration_effect = yes
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,971 @@
namespace = fp1_tbc
##################################################
# #Scope:actor-side Events
# 0001 - 0040 Bout Maintenance & Setup
# 0041 - 0060 Scope:actor Results
#
# #Scope:recipient-side Events
# 0101 - 0110 Champion Selection
# 0111 - 0130 Scope:recipient Results
##################################################
##################################################
# SCOPE:ACTOR-SIDE EVENTS
##################################################
# Bout Maintenance & Setup
# by Ewan Cowhig Croft
# 0001 - 0040
##################################################
# Everything is set for the bout to begin!
fp1_tbc.0001 = {
type = character_event
window = duel_event
title = fp1_tbc.0001.t
desc = {
desc = fp1_tbc.0001.desc.intro
first_valid = {
triggered_desc = {
trigger = { scope:champion = scope:recipient }
desc = fp1_tbc.0001.desc.recipient_fighting
}
desc = fp1_tbc.0001.desc.recipient_has_champion
}
desc = fp1_tbc.0001.desc.outro
}
theme = prison
left_portrait = {
character = scope:actor
scripted_animation = duel_wield_weapon
}
right_portrait = {
character = scope:champion
scripted_animation = duel_wield_weapon
}
override_background = { reference = terrain_scope }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
# If, for any reason, scope:recipient has died or been imprisoned, then the bout is cancelled.
scope:recipient = {
is_alive = yes
is_imprisoned = no
}
# Check that scope:actor is still in a valid state to fight.
trial_by_combat_shown_and_not_invalid_trigger = yes
# And scope:champion likewise.
scope:champion = {
OR = {
this = scope:recipient
eligible_knight_to_champion_trial_by_combat_trigger = yes
}
}
}
on_trigger_fail = {
# Inform both parties that the duel has invalidated.
scope:actor = {
send_interface_toast = {
title = fp1_tbc.0001.trigger_failure.actor
left_icon = scope:recipient
}
}
scope:recipient = {
send_interface_toast = {
title = fp1_tbc.0001.trigger_failure.recipient
left_icon = scope:actor
}
}
# Reset scope:actor's cooldowns against scope:recipient.
scope:actor = {
remove_interaction_cooldown = challenge_to_trial_by_combat_interaction
remove_interaction_cooldown_against = {
interaction = challenge_to_trial_by_combat_interaction
target = scope:recipient
}
}
}
immediate = {
play_music_cue = "mx_cue_combat_stinger"
# Nab scope:champion's location for terrain.
scope:champion.location = {
save_scope_as = background_terrain_scope
# And scope:champion's location name for loc.
barony = { save_scope_as = duel_location }
}
}
# Almost there.
option = {
name = fp1_tbc.0001.a
# Inform scope:actor that the bout will begin immediately.
custom_tooltip = fp1_tbc.0001.a.tt
# Configure the bout.
## Tribals strip to the waist.
single_combat_apply_default_shirtlessness_effect = {
ATTACKER = scope:actor
DEFENDER = scope:champion
}
## Deadly fights.
if = {
limit = { scope:tbc_death = yes }
configure_start_single_combat_effect = {
SC_INITIATOR = scope:actor
SC_ATTACKER = scope:actor
SC_DEFENDER = scope:champion
FATALITY = always
FIXED = no
LOCALE = terrain_scope
OUTPUT_EVENT = fp1_tbc.0011
INVALIDATION_EVENT = fp1_tbc.0021
}
}
## Non-deadly fights.
else = {
configure_start_single_combat_effect = {
SC_INITIATOR = scope:actor
SC_ATTACKER = scope:actor
SC_DEFENDER = scope:champion
FATALITY = no
FIXED = no
LOCALE = terrain_scope
OUTPUT_EVENT = fp1_tbc.0011
INVALIDATION_EVENT = fp1_tbc.0021
}
}
# No stress for single-option events.
ai_chance = {
# AI will always choose single option.
base = 100
}
}
}
scripted_effect fp1_tbc_non_lethal_results_effect = {
if = {
limit = {
scope:recipient = { is_alive = yes }
}
# TbC ends in cash settlement.
if = {
limit = { scope:tbc_gold = yes }
fp1_tbc_gold_effect = {
TBC_VICTOR = scope:actor
TBC_LOSER = scope:recipient
}
}
# TbC ends in favour settlement.
if = {
limit = { scope:tbc_weak_hook = yes }
fp1_tbc_hook_effect = {
TBC_VICTOR = scope:actor
TBC_LOSER = scope:recipient
}
}
# TbC ends in mandated humiliation.
if = {
limit = { scope:tbc_humiliation = yes }
fp1_tbc_humiliation_effect = {
TBC_LOSER = scope:recipient
TBC_VICTOR = scope:actor
}
}
}
}
scripted_effect fp1_tbc_consume_imprisonment_reasons_effect = {
if = {
limit = {
scope:actor = { is_alive = yes }
scope:recipient = { is_alive = yes }
}
scope:actor = { consume_imprisonment_reasons = scope:recipient }
}
}
# Bout has ended, inform affected parties.
fp1_tbc.0011 = {
hidden = yes
immediate = {
# If any clothes were stripped, put 'em back on.
single_combat_clean_shirtlessness_effect = {
ATTACKER = scope:actor
DEFENDER = scope:champion
}
# Did scope:actor win?
if = {
limit = { scope:sc_victor = scope:actor }
# Apply effects; we do this separately so that there's not a weird day's delay.
fp1_tbc_non_lethal_results_effect = yes
# And send out the ending events.
scope:actor = {
trigger_event = {
id = fp1_tbc.0041
days = 1
}
}
scope:recipient = {
trigger_event = {
id = fp1_tbc.0121
days = 1
}
}
}
# Or was it scope:champion?
else_if = {
limit = { scope:sc_victor = scope:champion }
# If scope:actor is still alive, they gain stress.
if = {
limit = {
scope:actor = { is_alive = yes }
}
fp1_tbc_actor_defeated_effect = {
TBC_LOSER = scope:actor
TBC_VICTOR = scope:recipient
}
}
# And send out the ending events.
scope:actor = {
trigger_event = {
id = fp1_tbc.0051
days = 1
}
}
scope:recipient = {
trigger_event = {
id = fp1_tbc.0111
days = 1
}
}
}
# If both parties are alive, and aren't good losers/don't have good reasons to forgive each other, then we mark them as potential rivals.
if = {
limit = {
scope:actor = {
is_alive = yes
NOR = {
has_trait = humble
has_trait = content
has_trait = just
has_trait = forgiving
}
}
scope:recipient = {
is_alive = yes
NOR = {
has_trait = humble
has_trait = content
has_trait = just
has_trait = forgiving
}
can_set_relation_potential_rival_trigger = { CHARACTER = scope:actor }
}
}
scope:actor = { set_relation_potential_rival = scope:recipient }
}
}
}
# Bout has invalidated, inform affected parties.
fp1_tbc.0021 = {
hidden = yes
immediate = {
# Put your shirts back on.
single_combat_clean_shirtlessness_effect = {
ATTACKER = scope:actor
DEFENDER = scope:recipient
}
# Inform both parties that the duel has invalidated.
scope:actor = {
send_interface_toast = {
title = fp1_tbc.0021.trigger_failure.actor
left_icon = scope:recipient
}
}
scope:recipient = {
send_interface_toast = {
title = fp1_tbc.0021.trigger_failure.recipient
left_icon = scope:actor
}
}
# Reset scope:actor's cooldowns against scope:recipient.
scope:actor = {
remove_interaction_cooldown = challenge_to_trial_by_combat_interaction
remove_interaction_cooldown_against = {
interaction = challenge_to_trial_by_combat_interaction
target = scope:recipient
}
}
}
}
# Scope:recipient has declined.
fp1_tbc.0031 = {
type = letter_event
opening = fp1_tbc.0031.opening
desc = fp1_tbc.0031.desc
sender = scope:recipient
option = { name = fp1_tbc.0031.a }
}
##################################################
# Scope:actor Results
# by Ewan Cowhig Croft
# 0041 - 0060
##################################################
# Scope:actor has won the bout.
fp1_tbc.0041 = {
type = character_event
title = fp1_tbc.0041.t
desc = {
desc = fp1_tbc.0041.desc.intro
# Scope:champion died in the fighting; no need to loc for a separate scope:champion, as they can't fight to the death.
triggered_desc = {
trigger = {
scope:champion = { is_alive = no }
}
desc = fp1_tbc.0041.desc.opponent_died
}
# Scope:champion is still alive.
triggered_desc = {
trigger = {
scope:champion = { is_alive = yes}
}
desc = {
first_valid = {
# Scope:recipient fought for themselves.
triggered_desc = {
trigger = { scope:champion = scope:recipient }
desc = fp1_tbc.0041.desc.opponent_lives.recipient_fighting
}
# Scope:recipient had a designated champion instead.
desc = fp1_tbc.0041.desc.opponent_lives.recipient_has_champion
}
}
}
# Reward, if anything.
first_valid = {
# Gold.
triggered_desc = {
trigger = { scope:tbc_gold = yes }
desc = fp1_tbc.0041.desc.reward.gold
}
# Weak hook.
triggered_desc = {
trigger = { scope:tbc_weak_hook = yes }
desc = fp1_tbc.0041.desc.reward.weak_hook
}
# Humiliation.
triggered_desc = {
trigger = { scope:tbc_humiliation = yes }
desc = fp1_tbc.0041.desc.reward.humiliation
}
# No outcome for death, since that's handled more succinctly above.
}
desc = fp1_tbc.0041.desc.outro
}
theme = prison
left_portrait = {
character = scope:actor
animation = personality_bold
}
right_portrait = {
character = scope:recipient
animation = shock
}
override_background = { reference = throne_room }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
# Juuuust need to double-check that they're actually alive.
is_alive = yes
}
immediate = {
# Show duel results from the player's POV.
show_as_tooltip = { fp1_tbc_non_lethal_results_effect = yes }
# Sadly, we have to apply some effects here instead of in the initial output event in order to not break tooltips.
single_combat_have_slain_kin_effect = {
ATTACKER = scope:actor
DEFENDER = scope:champion
}
fp1_tbc_consume_imprisonment_reasons_effect = yes
}
# The bout closes.
option = {
name = fp1_tbc.0041.a
# No stress for single-option events.
ai_chance = {
# AI will always choose single option.
base = 100
}
}
}
# Scope:actor has lost the bout.
fp1_tbc.0051 = {
type = character_event
title = fp1_tbc.0051.t
desc = {
desc = fp1_tbc.0051.desc.intro
# Scope:actor is still alive (alternatives not included because, well...).
first_valid = {
# Scope:recipient fought for themselves.
triggered_desc = {
trigger = { scope:champion = scope:recipient }
desc = fp1_tbc.0051.desc.opponent_lives.recipient_fighting
}
# Scope:recipient had a designated champion instead.
desc = fp1_tbc.0051.desc.opponent_lives.recipient_has_champion
}
desc = fp1_tbc.0051.desc.outro
}
theme = prison
left_portrait = {
character = scope:actor
animation = shock
}
right_portrait = {
character = scope:recipient
animation = personality_bold
}
override_background = { reference = throne_room }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
# Juuuust need to double-check that they're actually alive.
is_alive = yes
}
immediate = {
# Show duel results from the player's POV.
if = {
limit = {
scope:actor = { is_alive = yes }
}
fp1_tbc_actor_defeated_effect = {
TBC_LOSER = scope:actor
TBC_VICTOR = scope:recipient
}
}
show_as_tooltip = {
fp1_tbc_consume_imprisonment_reasons_effect = yes
single_combat_have_slain_kin_effect = {
ATTACKER = scope:actor
DEFENDER = scope:champion
}
}
}
# The bout closes.
option = {
name = fp1_tbc.0051.a
# No stress for single-option events.
ai_chance = {
# AI will always choose single option.
base = 100
}
}
}
##################################################
# SCOPE:RECIPIENT-SIDE EVENTS
##################################################
# Champion Selection
# by Ewan Cowhig Croft
# 0101 - 0110
##################################################
scripted_trigger fp1_tbc_knights_with_high_opinion_filter_trigger = {
# Has a ludicrously high opinion of scope:recipient.
opinion = {
target = scope:recipient
value >= 95
}
# And isn't one of the other knights presented.
NOR = {
AND = {
exists = scope:knight_best
this = scope:knight_best
}
AND = {
exists = scope:knight_exotic
this = scope:knight_exotic
}
AND = {
exists = scope:knight_alternative
this = scope:knight_alternative
}
}
}
# Scope:recipient has accepted a challenge to a Trial-by-Combat & must designate a champion due to ineligibility.
fp1_tbc.0101 = {
type = character_event
title = fp1_tbc.0101.t
desc = fp1_tbc.0101.desc
theme = prison
left_portrait = {
character = scope:recipient
animation = disbelief
}
right_portrait = {
character = scope:knight_best
animation = personality_honorable
}
lower_left_portrait = scope:knight_alternative
lower_center_portrait = scope:knight_exotic
lower_right_portrait = scope:knight_opinion
override_background = { reference = throne_room }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
}
immediate = {
play_music_cue = "mx_cue_prison"
# First, grab all available knights that are suitable for the Trial-by-Combat.
every_knight = {
limit = {
eligible_knight_to_champion_trial_by_combat_trigger = yes
NOT = {
has_court_position = champion_court_position #EP1: Pluck out the champion title holder
}
}
add_to_list = fp1_tbc_valid_knights_list
}
# Then, sort through the list, selecting the knight with the highest prowess.
ordered_in_list = {
list = fp1_tbc_valid_knights_list
order_by = prowess
save_scope_as = knight_best
}
# After that, we grab the most interesting knight (looking at assorted prowess-ish pecial traits and factoring for those) who isn't scope:knight_best.
ordered_in_list = {
list = fp1_tbc_valid_knights_list
limit = {
NOT = {
exists = scope:knight_best
this = scope:knight_best
}
has_relevant_special_single_combat_trait_trigger = yes
}
order_by = sce_has_single_combat_special_traits_value
save_scope_as = knight_exotic
}
#EP1: Fetch your champion if they exist
if = {
limit = {
employs_court_position = champion_court_position
any_court_position_holder = {
type = champion_court_position
is_physically_able_adult = yes # eligible_knight_to_champion_trial_by_combat_trigger checks for prowess, and its not mandatory that the champ has high value
}
}
random_court_position_holder = {
type = champion_court_position
save_scope_as = knight_alternative #same scope name is used due to limited portrait logic
}
}
# Then take the second highest-prowess knight who isn't scope:knight_best or scope:knight_exotic.
# EP1: Only do this if the court position of champion isn't already filled
ordered_in_list = {
list = fp1_tbc_valid_knights_list
limit = {
NOR = {
this = scope:knight_best
AND = {
exists = scope:knight_exotic
this = scope:knight_exotic
}
}
NOT = { employs_court_position = champion_court_position }
}
order_by = prowess
save_scope_as = knight_alternative
}
# Next, if we've got any knight who isn't scope:knight_best, scope:knight_exotic, or scope:knight_alternative, and who would literally murder for you, we grab them.
if = {
limit = {
any_in_list = {
list = fp1_tbc_valid_knights_list
fp1_tbc_knights_with_high_opinion_filter_trigger = yes
}
}
# First, add them to a sub-list.
every_in_list = {
list = fp1_tbc_valid_knights_list
limit = { fp1_tbc_knights_with_high_opinion_filter_trigger = yes }
add_to_list = fp1_tbc_high_opinion_knights_list
}
# Next, try to pluck out knightly soulmates.
if = {
limit = {
any_in_list = {
list = fp1_tbc_high_opinion_knights_list
any_relation = {
type = soulmate
this = scope:recipient
}
}
}
random_in_list = {
list = fp1_tbc_high_opinion_knights_list
limit = {
any_relation = {
type = soulmate
this = scope:recipient
}
}
save_scope_as = knight_opinion
}
}
# Otherwise, order by prowess and select the best.
else = {
ordered_in_list = {
list = fp1_tbc_high_opinion_knights_list
order_by = prowess
save_scope_as = knight_opinion
}
}
}
# Finally, if shenanigans have somehow deprived us of a scope:knight_best, then we want to generate someone to fill that minimum slot.
if = {
limit = {
NOT = { exists = scope:knight_best }
}
create_character = {
gender_female_chance = root_soldier_female_chance
location = scope:recipient.capital_province
template = new_warrior_character
faith = scope:recipient.capital_county.faith
culture = scope:recipient.capital_county.culture
save_scope_as = knight_best
}
add_courtier = scope:knight_best
}
}
# Take the most skilled knight.
option = {
name = fp1_tbc.0101.a
trigger = {
exists = scope:knight_best
}
# Select scope:knight_best to represent you in the bout.
scope:knight_best = { save_scope_as = champion }
custom_tooltip = fp1_tbc.0101.a.tt
custom_tooltip = fp1_tbc.0101.bout_moves_forward
highlight_portrait = scope:knight_best
# RP/functional choice: no stress charge.
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 0.75
ai_boldness = -0.5
}
}
}
# EP1: Take your already designated champion
option = {
name = fp1_ep1_tbc.0101.e
trigger = {
exists = scope:knight_alternative
scope:knight_alternative = { has_court_position = champion_court_position }
}
# Select scope:knight_best to represent you in the bout.
scope:knight_alternative = { save_scope_as = champion }
custom_tooltip = fp1_ep1_tbc.0101.e.tt
custom_tooltip = fp1_tbc.0101.bout_moves_forward
highlight_portrait = scope:knight_alternative
# RP/functional choice: no stress charge.
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 0.75
ai_boldness = -0.5
}
}
}
# Take the next most skilled knight.
option = {
name = fp1_tbc.0101.b
trigger = {
exists = scope:knight_alternative
scope:knight_alternative = { NOT = { has_court_position = champion_court_position } }
}
# Select scope:knight_best to represent you in the bout.
scope:knight_alternative = { save_scope_as = champion }
custom_tooltip = fp1_tbc.0101.b.tt
custom_tooltip = fp1_tbc.0101.bout_moves_forward
highlight_portrait = scope:knight_alternative
# RP/functional choice: no stress charge.
ai_chance = {
# There's no reason for the AI to ever take this option, we offer it entirely for players who dislike/wish to preserve their best knight.
base = 0
}
}
# Take the knight with the most special traits that *isn't* the most skilled knight.
option = {
name = fp1_tbc.0101.c
trigger = { exists = scope:knight_opinion }
# Select scope:knight_best to represent you in the bout.
scope:knight_exotic = { save_scope_as = champion }
custom_tooltip = fp1_tbc.0101.c.tt
custom_tooltip = fp1_tbc.0101.bout_moves_forward
highlight_portrait = scope:knight_exotic
# RP/functional choice: no stress charge.
ai_chance = {
base = 100
ai_value_modifier = {
ai_rationality = 0.5
ai_boldness = 0.25
}
}
}
# Take the knight who likes me the most.
option = {
name = fp1_tbc.0101.d
trigger = { exists = scope:knight_opinion}
# Select scope:knight_best to represent you in the bout.
scope:knight_opinion = { save_scope_as = champion }
custom_tooltip = fp1_tbc.0101.d.tt
custom_tooltip = fp1_tbc.0101.bout_moves_forward
highlight_portrait = scope:knight_opinion
# RP/functional choice: no stress charge.
ai_chance = {
base = 100
ai_value_modifier = {
ai_sociability = 0.5
ai_rationality = -0.75
}
}
}
# Then, we skip over to scope:actor to inform them what's up.
after = {
# Clean up any errant scopes we no longer need to avoid debug bloat.
clear_saved_scope = knight_best
if = {
limit = { exists = scope:knight_exotic }
clear_saved_scope = knight_exotic
}
if = {
limit = { exists = scope:knight_alternative }
clear_saved_scope = knight_alternative
}
if = {
limit = { exists = scope:knight_opinion }
clear_saved_scope = knight_opinion
}
# And transition.
scope:actor = { trigger_event = fp1_tbc.0001 }
}
}
fp1_tbc.0102 = {
desc = debug_main
theme = prison
option = {
name = interaction_debug_main
}
}
##################################################
# Scope:recipient Results
# by Ewan Cowhig Croft
# 0111 - 0130
##################################################
# Scope:recipient has won the bout.
fp1_tbc.0111 = {
type = character_event
title = fp1_tbc.0111.t
desc = {
desc = fp1_tbc.0111.desc.intro
# Scope:actor died in the fighting; we don't account for
triggered_desc = {
trigger = {
scope:actor = { is_alive = no }
}
desc = fp1_tbc.0111.desc.opponent_died.recipient_fighting
}
# Scope:actor is still alive.
triggered_desc = {
trigger = {
scope:actor = { is_alive = yes}
}
desc = {
first_valid = {
# Scope:recipient fought for themselves.
triggered_desc = {
trigger = { scope:champion = scope:recipient }
desc = fp1_tbc.0111.desc.opponent_lives.recipient_fighting
}
# Scope:recipient had a designated champion instead.
desc = fp1_tbc.0111.desc.opponent_lives.recipient_has_champion
}
}
}
desc = fp1_tbc.0111.desc.outro
}
theme = prison
left_portrait = {
character = scope:recipient
animation = personality_bold
}
right_portrait = {
character = scope:actor
animation = shock
}
override_background = { reference = throne_room }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
# Juuuust need to double-check that they're actually alive.
is_alive = yes
}
immediate = {
# Show duel results from the player's POV.
if = {
limit = {
scope:actor = { is_alive = yes }
}
fp1_tbc_actor_defeated_effect = {
TBC_LOSER = scope:actor
TBC_VICTOR = scope:recipient
}
}
# Sadly, we have to apply some effects here instead of in the initial output event in order to not break tooltips.
single_combat_have_slain_kin_effect = {
ATTACKER = scope:actor
DEFENDER = scope:champion
}
fp1_tbc_consume_imprisonment_reasons_effect = yes
}
# The bout closes.
option = {
name = fp1_tbc.0111.a
# No stress for single-option events.
ai_chance = {
# AI will always choose single option.
base = 100
}
}
}
# Scope:recipient has lost the bout.
fp1_tbc.0121 = {
type = character_event
title = fp1_tbc.0121.t
desc = {
desc = fp1_tbc.0121.desc.intro
# We don't need to account for scope:champion dying in the fighting; if it was scope:recipient, then they're dead, and a separate champion cannot be challenged to a fight to the death.
# Scope:champion is still alive.
first_valid = {
# Scope:recipient fought for themselves.
triggered_desc = {
trigger = { scope:champion = scope:recipient }
desc = fp1_tbc.0121.desc.champion_lives.recipient_fighting
}
# Scope:recipient had a designated champion instead.
desc = fp1_tbc.0121.desc.champion_lives.recipient_has_champion
}
# Reward, if anything.
first_valid = {
# Gold.
triggered_desc = {
trigger = { scope:tbc_gold = yes }
desc = fp1_tbc.0121.desc.reward.gold
}
# Weak hook.
triggered_desc = {
trigger = { scope:tbc_weak_hook = yes }
desc = fp1_tbc.0121.desc.reward.weak_hook
}
# Humiliation.
triggered_desc = {
trigger = { scope:tbc_humiliation = yes }
desc = fp1_tbc.0121.desc.reward.humiliation
}
# No outcome for death, since that's handled more succinctly above.
}
desc = fp1_tbc.0121.desc.outro
}
theme = prison
left_portrait = {
character = scope:recipient
animation = shock
}
right_portrait = {
character = scope:actor
animation = personality_bold
}
override_background = { reference = throne_room }
trigger = {
# DLC check.
has_fp1_dlc_trigger = yes
# Juuuust need to double-check that they're actually alive.
is_alive = yes
}
immediate = {
# Show duel results from the player's POV.
show_as_tooltip = { fp1_tbc_non_lethal_results_effect = yes }
# Sadly, we have to apply some effects here instead of in the initial output event in order to not break tooltips.
fp1_tbc_consume_imprisonment_reasons_effect = yes
}
# The bout closes.
option = {
name = fp1_tbc.0121.a
# No stress for single-option events.
ai_chance = {
# AI will always choose single option.
base = 100
}
}
}

View file

@ -0,0 +1,29 @@
namespace = fp1_varangian_adventures
##################################################
# #Maintenance Events
# 0001 - 0010 Boost attacker control after the war.
##################################################
##################################################
# #Maintenance Events
##################################################
# Boost Attacker Control
# by Ewan Cowhig Croft
# 0001 - 0010
##################################################
# Boost control in newly conquered lands.
fp1_varangian_adventures.0001 = {
hidden = yes
immediate = {
every_realm_county = { change_county_control = 50 }
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,552 @@
namespace = fp2_struggle
######################################
# EL CID'S BIZARRE ADVENTURE SYSTEM
# By Hugo Cortell
######################################
fp2_struggle.2045 = {
hidden = yes
trigger = {
is_landless_adventurer = no
}
immediate = {
if = { # Startup changes (give the cid his full nickname when he starts adventuring)
limit = { NOT = { has_character_flag = has_already_begun_travelling } }
remove_nickname = yes
give_nickname = nick_the_cid_campeador
add_character_flag = has_already_begun_travelling # Prevents yearly pulse from stacking up requests
add_character_flag = blocked_from_leaving # Prevents el cid from vacationing in far away lands
}
if = {
limit = { NOT = { has_character_flag = finished_el_cids_travels } } # In case several requests for the event are stacked up
if = { # Being a guest is used as a boolean to check if the character is in an "evaluation" phase or already in a court. DO NOT USE THE GUEST SYSTEM FOR THIS.
limit = {
OR = {
is_pool_guest = yes
is_pool_character = yes
is_foreign_court_guest = yes
}
}
random_county_in_region = { # Naturally biased in favor of larger states
limit = { exists = holder.liege }
weight = {
base = 1
modifier = {
add = 10
holder.liege = { has_relation_friend = root }
}
modifier = {
add = 30
holder.liege = { has_relation_best_friend = root }
}
compare_modifier = {
value = holder.prestige_level
multiplier = 1.5
}
}
region = world_europe_west_iberia # Locks el cid's forced travels to iberia
holder.liege = { trigger_event = fp2_struggle.2051 }
}
}
else = {
if = {
limit = { exists = liege }
liege = { trigger_event = fp2_struggle.2050 } # This is you, you get the event, while el cid gets the "system event"
}
else = {
employer = { trigger_event = fp2_struggle.2050 } # ditto
}
}
}
}
}
#############################################################
# Unease About El Sidi
# By The Content Design Team (And scripted by Hugo Cortell)
#############################################################
scripted_trigger el_cid_too_important_trigger = {
OR = {
any_extended_family_member = { this = scope:fp2_2050_el_cid }
scope:fp2_2050_el_cid = { is_vassal_of = ROOT }
has_relation_best_friend = scope:fp2_2050_el_cid
is_spouse_of = scope:fp2_2050_el_cid
}
}
fp2_struggle.2050 = {
type = character_event
title = {
random_valid = {
triggered_desc = { # Muslim Titles
trigger = { religion = religion:islam_religion }
desc = {
random_valid = {
desc = fp2_struggle.2050.t_muslim_one
desc = fp2_struggle.2050.t_muslim_two
desc = fp2_struggle.2050.t_muslim_three
desc = fp2_struggle.2050.t_muslim_four
}
}
}
triggered_desc = { # Generic (Christian, nickname-like) Titles
trigger = { NOT = { religion = religion:islam_religion } }
desc = {
random_valid = {
desc = fp2_struggle.2050.t_generic_one
desc = fp2_struggle.2050.t_generic_two
desc = fp2_struggle.2050.t_generic_three
desc = fp2_struggle.2050.t_generic_four
}
}
}
}
}
desc = { # See immediate for flags
first_valid = {
triggered_desc = {
trigger = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:generic_court }
desc = fp2_struggle.2050.desc_court
}
triggered_desc = {
trigger = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:jelly_knights }
desc = fp2_struggle.2050.desc_knights
}
triggered_desc = {
trigger = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:upset_nobles }
desc = fp2_struggle.2050.desc_nobles
}
triggered_desc = {
trigger = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:faith_discomfort }
desc = fp2_struggle.2050.desc_faith
}
desc = board_games.0001.desc.i_am_winning.trait.rowdy # Theoretically impossible to trigger, but if something breaks, players will see this and report it for sure
}
}
theme = corruption
override_background = { reference = throne_room }
left_portrait = {
character = root
animation = personality_rational
}
right_portrait = {
character = scope:fp2_2050_el_cid
animation = throne_room_two_handed_passive_1
}
immediate = {
character:107590 = { save_scope_as = fp2_2050_el_cid }
random_list = { # Spin the wheel to decide who and why wishes ill on el cid
10 = { # Generic "the court thinks he is bad"
save_scope_value_as = {
name = fp2_2050_reason_for_kicking_out_el_cid
value = flag:generic_court
}
}
10 = { # Your knights are all sore losers
modifier = {
add = 30
any_knight = {
OR = {
has_relation_rival = scope:fp2_2050_el_cid
has_relation_nemesis = scope:fp2_2050_el_cid
}
}
}
save_scope_value_as = {
name = fp2_2050_reason_for_kicking_out_el_cid
value = flag:jelly_knights
}
}
10 = { # Nobles dislike upstart poor people
modifier = {
add = 30
any_vassal = {
OR = {
has_relation_rival = scope:fp2_2050_el_cid
has_relation_nemesis = scope:fp2_2050_el_cid
}
}
}
save_scope_value_as = {
name = fp2_2050_reason_for_kicking_out_el_cid
value = flag:upset_nobles
}
}
10 = { # Generic faith concerns from your bishop
save_scope_value_as = {
name = fp2_2050_reason_for_kicking_out_el_cid
value = flag:faith_discomfort
}
}
}
}
option = { # Family, Friend or Vassal
name = fp2_struggle.2050.a
trigger = { el_cid_too_important_trigger = yes }
hidden_effect = {
scope:fp2_2050_el_cid = { add_character_flag = finished_el_cids_travels } # At this point we can imagine that this character has settled, this stops the cycle to prevent spam
}
custom_tooltip = fp2_struggle.2050.a.serve_tooltip
send_interface_toast = {
type = event_toast_effect_good
title = fp2_struggle.2050.a.notif.t
right_icon = scope:fp2_2050_el_cid
reverse_add_opinion = {
target = scope:fp2_2050_el_cid
modifier = stood_by_me_opinion
opinion = 10
years = 20
}
}
stress_impact = {
fickle = minor_stress_impact_gain
}
ai_chance = { base = 1000 }
}
option = { # No, I stand by my knight and he can stay!
name = fp2_struggle.2050.b
trigger = {
is_ai = no
NOT = { scope:fp2_2050_el_cid = { is_vassal_of = ROOT } }
}
custom_tooltip = fp2_struggle.2050.a.serve_tooltip
send_interface_toast = {
type = event_toast_effect_good
title = fp2_struggle.2050.a.notif.t
right_icon = scope:fp2_2050_el_cid
if = {
limit = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:generic_court }
add_character_modifier = {
modifier = fp2_kept_accused_traitor_in_court_modifier
years = 10
}
}
else_if = {
limit = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:jelly_knights }
add_character_modifier = {
modifier = fp2_kept_op_knight_in_court_modifier
years = 10
}
}
else_if = {
limit = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:upset_nobles }
add_character_modifier = {
modifier = fp2_kept_upstart_knight_in_court_modifier
years = 10
}
}
else_if = {
limit = { scope:fp2_2050_reason_for_kicking_out_el_cid = flag:faith_discomfort }
add_character_modifier = {
modifier = fp2_kept_godless_mercenary_in_court_modifier
years = 10
}
}
reverse_add_opinion = {
target = scope:fp2_2050_el_cid
modifier = stood_by_me_opinion
opinion = 10
years = 20
}
scope:fp2_2050_el_cid = {
trigger_event = {
id = fp2_struggle.2045
years = { 4 12 }
}
}
}
stress_impact = {
fickle = minor_stress_impact_gain
}
}
option = { # Okay, please do not give me malus
name = fp2_struggle.2050.c
trigger = {
NOT = { scope:fp2_2050_el_cid = { is_vassal_of = ROOT } }
}
send_interface_toast = {
type = event_toast_effect_bad
title = fp2_struggle.2051.t
right_icon = scope:fp2_2050_el_cid
scope:fp2_2050_el_cid = {
move_to_pool = yes
trigger_event = {
id = fp2_struggle.2045
days = { 1 4 }
}
}
}
stress_impact = {
generous = minor_stress_impact_gain
}
ai_chance = { base = 1 }
}
option = { # Vanish el cid, even though he is your vassal (suggested by Max)
name = fp2_struggle.2050.c
trigger = {
is_ai = no
scope:fp2_2050_el_cid = { is_vassal_of = ROOT }
}
# The only reason to ever select this option is to gain those "repossessed" lands, but it is very mean.
# It will give you tyranny, but it won't directly anger your vassals as they are *narratively* the reason why this is happening.
# The primary reason this exists is to prevent ludonarrative dissonance with the event's description. It is less resource intensive than making new loc.
# We set the tyranny and opinion loss based on how much was lost (Placed outside the toast to prevent clutter)
add_tyranny = {
value = medium_tyranny_gain
multiply = scope:fp2_2050_el_cid.primary_title.tier
}
if = {
limit = { can_set_relation_rival_trigger = { CHARACTER = scope:fp2_2050_el_cid } }
set_relation_rival = scope:fp2_2050_el_cid
}
if = { # This is not out of order, it is WAD. If can_set_relation_rival_trigger fails, you just lose a friend but not gain a rival.
limit = { has_relation_friend = scope:fp2_2050_el_cid }
remove_relation_friend = scope:fp2_2050_el_cid
}
if = {
limit = { scope:fp2_2050_el_cid.primary_title.tier < tier_kingdom }
scope:fp2_2050_el_cid = {
add_opinion = {
modifier = betrayed_me_opinion
target = root
opinion = -100
}
}
}
else = {
scope:fp2_2050_el_cid = {
add_opinion = {
modifier = betrayed_me_opinion
target = root
opinion = -200
}
}
}
create_title_and_vassal_change = { # This tells the engine to start paying closer attention to title changes (and not butt in)
type = revoked
save_scope_as = change
}
scope:fp2_2050_el_cid = {
every_held_title = {
change_title_holder = {
holder = root
change = scope:change
}
}
}
resolve_title_and_vassal_change = scope:change # Tells the engine that it is safe to go about its buisness with titles
show_as_tooltip = { scope:fp2_2050_el_cid = { move_to_pool = yes } } # Just jomini things~
hidden_effect = { # Prevents rendering of toast on option highlight
send_interface_toast = {
type = event_toast_effect_bad
title = fp2_struggle.2051.t
right_icon = scope:fp2_2050_el_cid
show_as_tooltip = { # Condensed version to fit into the toast
if = {
limit = { scope:fp2_2050_el_cid.primary_title.tier > tier_duchy }
scope:fp2_2050_el_cid = {
if = {
limit = { has_relation_nemesis = ROOT }
set_relation_nemesis = ROOT
}
add_opinion = {
modifier = betrayed_me_opinion
target = root
opinion = -200
}
}
}
else = {
if = {
limit = { has_relation_rival = ROOT }
set_relation_rival = ROOT
}
add_opinion = {
modifier = betrayed_me_opinion
target = root
opinion = -100
}
}
}
# Standard stuff
scope:fp2_2050_el_cid = {
move_to_pool = yes
trigger_event = {
id = fp2_struggle.2045
days = { 1 4 }
}
}
}
}
stress_impact = { # This kind of action comes with quite a bit of stress
generous = minor_stress_impact_gain
brave = medium_stress_impact_gain
forgiving = major_stress_impact_gain
gregarious = medium_stress_impact_gain
honest = minor_stress_impact_gain
humble = medium_stress_impact_gain
just = major_stress_impact_gain
trusting = medium_stress_impact_gain
compassionate = major_stress_impact_gain
august = minor_stress_impact_gain
gallant = medium_stress_impact_gain
}
}
}
############################################################
# El Cid Arrives At Your Court
# By The Content Design Team (And scripted by Hugo Cortell)
############################################################
fp2_struggle.2051 = {
type = character_event
title = fp2_struggle.2051.t
desc = fp2_struggle.2051.desc
theme = vassal
override_background = { reference = throne_room }
left_portrait = {
character = root
animation = personality_rational
}
right_portrait = {
character = scope:fp2_2050_el_cid
animation = throne_room_one_handed_passive_1
}
immediate = {
character:107590 = { save_scope_as = fp2_2050_el_cid }
add_visiting_courtier = scope:fp2_2050_el_cid
}
option = { # You will enjoy a high position at my court!
name = fp2_struggle.2051.a
send_interface_toast = {
type = event_toast_effect_good
title = fp2_struggle.2050.a.notif.t
right_icon = scope:fp2_2050_el_cid
pay_treasury_or_gold = {
target = scope:fp2_2050_el_cid
value = medium_treasury_or_gold_value
}
add_courtier = scope:fp2_2050_el_cid
}
if = {
limit = { exists = cp:councillor_marshal }
fire_councillor = cp:councillor_marshal
}
assign_councillor_type = {
type = councillor_marshal
target = scope:fp2_2050_el_cid
}
scope:fp2_2050_el_cid = {
add_opinion = {
target = root
modifier = hired_me_opinion
opinion = 20
}
add_opinion = {
target = root
modifier = given_luxuries_opinion
opinion = 10
}
trigger_event = {
id = fp2_struggle.2045
years = { 4 12 }
}
}
trigger = { is_ai = no }
}
option = { # Welcome or whatever
name = fp2_struggle.2051.b
send_interface_toast = {
type = event_toast_effect_good
title = fp2_struggle.2050.a.notif.t
right_icon = scope:fp2_2050_el_cid
pay_treasury_or_gold = {
target = scope:fp2_2050_el_cid
value = minor_treasury_or_gold_value
}
add_courtier = scope:fp2_2050_el_cid
}
scope:fp2_2050_el_cid = {
trigger_event = {
id = fp2_struggle.2045
years = { 4 10 }
}
}
ai_chance = { base = 65 }
}
option = { # Away with you vile beggar!
name = fp2_struggle.2051.c
send_interface_toast = {
type = event_toast_effect_bad
title = fp2_struggle.2051.t
right_icon = scope:fp2_2050_el_cid
custom_tooltip = fp2_struggle.2050.c.notif
scope:fp2_2050_el_cid = {
move_to_pool = yes
trigger_event = {
id = fp2_struggle.2045
days = { 1 4 }
}
}
}
ai_chance = { base = 45 }
}
}

Some files were not shown because too many files have changed in this diff Show more