• We have updated our Community Code of Conduct. Please read through the new rules for the forum that are an integral part of Paradox Interactive’s User Agreement.

CK2 Dev Diary #73 - Modding patch notes

Good morning, everyone. I’m Magne “Meneth” Skjæran, and somehow someone decided it’d be a good idea to let me do yet another dev diary. In the past I’ve written about modding, optimization, quality of life, and a handful of other topics.

Today, I’ll return once more to the topic of modding, by giving you the whole modding changelog in all its glory. A while back we gave you the modding changelog up to that point in time, minus some features (most notably offmap powers) that had yet to be revealed. This time around, no redaction is necessary.

We consider the CK2 modding community to be a great asset; the ability for users to tailor the game to their preferences, or to leave the confines of the Middle Ages entirely, adds significant replay value to the game. The modding community is also a great recruiting ground; I myself am a former modder, and PDS recently hired AGOT modder Matthew “blackninja9939” Clohessy as a content designer, and numerous other people at PDS have modded the games at one point or another.

Therefore, in each major patch we add a number of modding improvements for the sake of modders, on top of trying to make any features we add for the patch or expansion as moddable as reasonably possible. This makes the job of our content designers easier, and ensures the modding community has the ability to make significant changes to the game.

Without further ado, here’s the mod changelog for 2.8:

###################
# User modding
###################
- Added an offmap_powers system
- You can scope to any offmap power by using its name. E.G., "china = { }"
- Added governor_title and governor scopes, which can be used within an offmap power scope
- Added offmap_power scope, which can be used while within the scope of the governor or governor title to scope to the offmap power they represent
- Added triggers has_status, prev_status, has_status_flag, prev_status flag, has_policy, prev_policy, has_policy_flag, and prev_policy_flag
- Added effects set_status and set_policy
- Added on_actions on_offmap_policy_changed and on_offmap_status_changed
- Added on_actions on_offmap_governor_changed and on_offmap_ruler_changed
- Added on_actions on_offmap_monthly_pulse and on_offmap_yearly_pulse
- You can now get the offmap power from the holder (ie emperor)
- You can now add and clear flags from an offmap power (add_offmap_tmp_flag and clr_offmap_tmp_flag)
- You can now check if an offmap power has a flag
- either if the flag was added to it ( has_offmap_tmp_flag )
- or if the flag was added, as well as if the current status or policy has the flag (has_offmap_flag)
- Added loc commands for offmaps: Offmap, Ruler, PrevRuler, Governor, PrevGovernor, GovernorTitle, GetName, GetPolicy, GetPrevPolicy, GetStatus, GetPrevStatus, and GetCurrency
- Added set_offmap_holder and set_offmap_name effects
- Added has_offmap_name and has_had_offmap_name triggers
- Added an "offmap" pre-trigger. Takes "allow" or "only". Any event without this set cannot trigger for offmap rulers
- Added an offmap_powers history folder
- Added is_offmap_ruler and is_offmap_governor triggers
- The trigger is_within_diplomatic_range now works with offmap powers. This is equivalent to testing it against the governor. The same behavior will be used if the governor title or offmap ruler is scoped to
- Added trigger has_offmap_currency and effect add_offmap_currency
- The "tier" triggers can now take an offmap as the left-hand-side
- Added offmap_decision type that are only shown on the offmap screen
- Added is_offmap_tag trigger that checks if the current scope represents the given offmap
- Added offmap_ruler scope
- Added has_offmap_news_enabled trigger
- Added console commands add_offmap_currency, set_offmap_status, set_offmap_policy, kill_offmap_ruler, and kill_offmap_dynasty
- Offmaps can be scoped to in loc by using their name. E.G. [offmap_china.GetName]
- Added portrait_offmap trigger, for checking what offmap power a character rules for portrait purposes

- Split the defines CONTESTED_TITLE_OCCUPIED_WARSCORE_BONUS and CONTESTED_TITLE_OCCUPIED_WARSCORE_BONUS_INDEP into attacker and defender version
- Split the 'ticking_war_score_multiplier' in Casus Belli scripts into 'att_ticking_war_score_multiplier' and 'def_ticking_war_score_multiplier'
- Added a new define for the effect of Fort Level on defender morale in sieges: FORT_LEVEL_MORALE_LOSS_REDUCTION_MULT
- Fixed a number of scopes not getting localised as effects, only as triggers
- error.log will now usually tell you if you've saved a map file in the wrong format
- The game will now crash slightly earlier if the province map is the wrong size (not a multiple of 64), making the issue easier to identify
- Cultures can now have "dynasty_name_first = yes" which puts the dynasty name before the personal name
- Added a "holding_types" folder in common. This can be used to define additional triggers for building each holding type
- The scaled_wealth trigger now supports "min" and "max" just like the scaled_wealth effect
- Fixed "effect" in history not being seeded, meaning that all effects with a random component would always produce the exact same result. Now the result will be properly randomized
- Build cost and build time modifiers now apply to forts, trade posts, and hospitals too. Note that there are still no type-specific modifiers for these three holdings
- on_heresy_takeover no longer creates a dummy character for the religion scope, but instead uses an actual religion scope
- "Religion" in loc while already in a religion will just return the same religion, to ensure that any loc written based on some on-actions using characters as makeshift religion scopes continue to work. The same has been done for "Culture" in culture scopes
- Most effects and triggers that take a number can now take a variable name instead, and will grab the variable from the current scope. E.G., "wealth = test_variable"
- gain_effect now fires in all cases (except history and death) for job titles and minor titles, including when added through script
- lose_effect or retire_effect now fires in all cases (except history and death) for job titles and minor titles. Being given a new job title will fire retire_effect on the old title, and gain_effect on the new title
- Fixed resigning as a commander firing lose_effect rather than retire_effect
- Added death_effect for job titles and minor titles, which fires when a character dies while holding the job/minor title
- Made the following console commands that before were only available to devs and beta testers available to everyone: guibounds, noai, join_society, leave_society, society_rank_up/down, society_currency, set_society_grandmaster, get_all_artifacts, activate_artifacts
- Added the console command "province_religion" or ("prov_rel") to change the religion of a province. Syntax is: "province_religion <province> <religion>"
- Targeted decisions now support having a 3rd party character or artifact
- Now possible to store variables in the same manner as event targets; any variable starting with "local_" will work this way, meaning it'll persist as long as the event chain does, but not be accessible outside it
- Uploading mods to Steam is no longer limited to 50MB
- Added the following targeted decision filters: court_including_me, home_court_including_me, dynasty_including_me, all_including_me, society_including_me, realm_including_me, sub_realm_including_me
- The regular versions of the above now consistently exclude the character themselves; in some cases before this restriction only applied if the AI was taking the decision
- Added max_defender_occupation_score and max_attacker_occupation_score modifiers for casus belli types
- Added documentation for the "aggression" parameter for governments
- Added a become_secret_heretic effect
- Added TRADE_ROUTE_SIEGE_MULTIPLIER and TRADE_ROUTE_OCCUPATION_MULTIPLIER defines
- Made the tributary system moddable and modular. You can now add new tributary types defining:
- when and if the tributary relation breaks
- what CBs the tributaries can use against their suzerain
- The allowed_to_target_suzerains CB parameter no longer has any effect, as the above replaces it
- if tributaries can unite together against their suzerain
- if tributaries can fight against each other
- if the suzerain can call their tributaries to arms, and if the tributaries are forced to join
- if the tributaries can call their suzerain to their defense, and if the suzerain is forced to join
- how much of what is paid by the tributary to the suzerain
- What icon to use for the diplomatic relation
- What modifiers to give the tributary
- The tributary system now functions even if Horse Lords isn't enabled, though the CBs and the like are still limited by DLC; this means you can now make your own tributary systems even without your mod's users having HL
- You can now use the is_tributary trigger to check for a specific type, and a specific suzerain
- You can now use custom loc in the is_tributary trigger
- The set_tribute_suzerain now takes a "type" parameter, specifying the type. If none is specified, "default" is used
- Added set_trade_route_base_value and set_trade_route_value_multiplier effects
- Provinces with several trade routes will now show the presence and effect of all of them in their tooltip
- Effect and trigger scope changes now have an optional "show_scope_change" parameter. If set to "no", the scope change won't be shown in the tooltip. It'll be shown as just "effect description" rather than "scope change: effect description". This functionality isn't supported by any/random scopes.
- Added hostages_block_cb parameter for CBs
- Variables that haven't been set yet now work in localisation; they'll show "0" rather than simply being blank. "GetName" works as well. So [global_test.GetName] will return 0 for GetValue, and the "global_test" localisation for GetName
- Fixed the is_interested_in_society trigger not localising properly if negated, and not ending with a linebreak
- Added interested_in_society_of_character trigger
- Fixed empty "OR" triggers in some cases crashing the game on launch
- show_as_title = yes for minor titles now works even if the character has no titles
- Fixed a crash that could happen when a selectable object overlapped with an impassable province
- Fixed setting someone's employer on the same date that employer becomes landed not working properly
- Fixed capital changes in some cases failing if the county holder became holder on the same day as the capital change
- Added as_if_allied_to parameter for gain_settlements_under_title, vassalize_or_take_under_title, subjugate_or_take_under_title, and vassalize_or_take_under_title_destroy_duchies. This ensures that land occupied by people in that character's war against the title's holder can be taken
- Castes can now be enabled for individual religions rather than being hardcoded to the Indian group. This is done using the "castes" parameter
- Removed various hardcoding associated with the Hindu religion. This is now connected to the "caste_opinions" parameter instead
- The subjugation opinion is no longer applied when using vassalize_or_take_under_title, just subjugate_or_take_under_title
- Added event pretrigger for Game Book
- Decisions can now have a "_desc_extra" localisation key defined. This will be shown after the Requirements section in its tooltip
- Added "conditional_tooltip"; defines when a given piece of trigger script should be displayed. Its contents are only evaluated if it is displayed
- Added government parameters gets_religion_opinion_penalties, gives_religion_opinion_penalties, and vassal_government_opinion_penalties. See _governments.info for documentation
- Added title parameters can_be_claimed and can_be_usurped. See 00_landed_titles.info for documentation
- Added "offmap_power" government parameters, which is used for the new succ_offmap_succession law
- You can now use "extended" (bracket-based) localization in Artifact scopes:
- [GetName] will display the name
- [Owner] will rescope to the current owner of the artifact
- [OriginalOwner] will rescope to the original owner of the artifact
- There is now an AI exclusion pretrigger in decision "ai = no" that can be used to avoid decisions being considered by the AI at all
- Removed the "coalition_threat" CB parameter as it had nothing to do with coalitions
- Fixed rulers in some cases being considered to have no primary holding on the day of their death when going backwards in history
- Added console commands "print_global_flags" (aka "pgf") and "print_global_variables" (aka "print_global_vars" and "pgv"). They print whatever they're named after
- "character_info" aliased to "debug_mode" since it is used by more than just character to display debug info
- The Offmap Powers view will now display flags and variables that are set for offmap powers, including those of the title holders
- Added "attrition" character modifier. This will reduce/increase the attrition suffered by the army they command. It is capped at -99%
- Added "army_reinforce_rate" character modifier. This will make the army the character commands reinforce faster. Affects retinues and horde units as well, not just levies. Does not affect the reinforcement of the settlement itself. Cannot go below 0
- Added "days_of_supply" character modifier. This modifies the number of days of supply of the army the character commands by an absolute number of days. Days of supply cannot go below 1
- Added command modifiers phase_skirmish_attack, phase_pursue_attack, phase_melee_attack, phase_skirmish_defense, phase_pursue_defense, and phase_melee_defense
- Added scopes any_neighbor_independent_ruler and random_neighbor_independent_ruler. A "neighbor independent ruler" is a ruler that neighbors the realm you're in (E.G., the HRE if you're a count in the HRE)
- Added "demesne_size_compared_to_limit" trigger. For example, "demesne_size_compared_to_limit < 0.5" will check if someone is below 50% of their demesne limit
- Added "multiplicative_trade_post_income_modifier" holding modifier
- Added "can_create_empires" government parameter (can_create_kingdoms already exists)
- Added "extra_ai_eval_troops" title parameter. See 00_landed_titles.info for documentation
- Added "relative_realm_size" trigger. For example, relative_realm_size = { who = liege size > 0.2 } checks that your realm size is at least 20% of your liege's
- Strings that are too long (above 1023 characters) will no longer crash the game, though they should still be avoided as they simply don't work beyond 1023 characters. This should also solve crashes involving mismatched quote signs
- Strings that are too long now get logged in error.log
- The game will no longer crash if more than 32767 flags (E.G., set_character_flag) are used. New limit is 2^32, which you will run out of memory long before reaching
- Using export_to_variable on a dead character will no longer crash the game
- has_coa_on_barony_only can now be set to yes/no on individual religions rather than just groups. This will override whatever has been set for the group
- The "give_title" console command now gives more feedback if something is wrong with the parameters
- Absolutely all tooltips now support custom loc. Generally, "Root" will be the player
- Most text directly related to religion (E.G., religion name, description, holy war name) now provide the religion itself for custom loc purposes
- Added a "RelHead" promotion for religion loc, meaning you can now for example name a religion "Cult of [RelHead.GetFirstName]"
- Added optional generate_tooltip parameter for hidden effects. If set to "no", the game won't generate the tooltip at all. Note that if event targets are set in the hidden effect, this will break them in tooltips. It may also break randomization, so only ever use it if you have a really compelling reason to do so
- Added 'add_modifier' and 'remove_modifier' console commands (for Character Modifiers.)
- Added 'decision' console command, which ignores the trigger conditions
- Stewardship no longer applies a debuff when below 5; 0 is its baseline now like all the other stats
- Added 'realm_levies_plus_allies' as an exportable value for the 'export_to_variable' effect.
- Added a Define for Looter army maintenance cost (LOOTER_ARMY_MAINT_MULT)
- random_list chances below 1% but above 0% will now use 2 decimals rather than 0
- The game will now log invalid tributary relationships in history (E.G., someone being a tributary of a title with no holder)
- Fixed looting for raiding adventurers not of a religion/culture/government that allows raiding not working
- If the flag "always_show_in_marriage_selection" is set on a character, they will bypass most conditions to be shown in the marriage selection view. Note that this does *not* allow otherwise illegal marriages, just ensures they show up in the listing
- Fixed observing unplayable characters instantly booting you back to regular observe mode
- headgear_that_hides_hair now bases itself on the portraitType of the headgear rather than the character. This means that if someone changes culture and thus gets headgear that should hide their hair, it actually will
- OR and AND triggers now don't show "all/one of the following..." if there's only a single trigger within them
- Fixed it being possible for landed title adjectives in some edge cases ending up empty
- Added the old religion to FROM scope 'in on_county_religion_change'
- Added trigger 'had_artifact_flag'
- Added trigger 'artifact' (to compare two artifact scopes)
- Added trigger 'climate'
- Fixed the "completely_controls" trigger not considering empty non-wasteland provinces
- Fixed scoping to event targets in effects not being properly localised, thus showing just a colon with no name before it
- Added "ai_check_interval" parameter for decisions. This determines how rarely the AI checks a given decision, and can be useful for performance-heavy decisions that don't need to be checked often. See 00_decisions.info for documentation
- Added a "shares_realm_border_with" trigger. Checks if any province in your realm (everything under your titles) borders any province in their realm
- Added COALITION_THREAT_MAX_DISTANCE define. Independent AIs will consider independent rulers within this range to be threats if they're strong enough (COALITION_SCARY_TROOP_STRENGTH_THREAT_RATIO)
- "Added COURTIER_EVENT_PROCESS_OFFSET define, which determines how often courtiers check MTTH events. Set to 50, as compared to 20 for rulers". This changelog entry from 2.7 now actually has an effect
- Added num_of_society_members trigger. Scope must be a character or society. Returns true if the society has at least this many members. Also supports <, <=, ==, and >=
- A lot of error messages that previously only showed in the internal beta .exe now get logged at all times
- Added "hire_range" parameter for mercenary titles. If set, this overrides the MERCENARY_HIRE_DISTANCE_THRESHOLD define for that specific mercenary
- Added "can_demand_religious_conversion" government parameter. Decides whether people with the government can use the Demand Religious Conversion interaction. Defaults to yes
- create_character now supports "dynasty = actually_culture" which picks a random dynasty name from the culture if there's no unused static dynasty to use, rather than just resorting to a random holding in the world (what "dynasty = culture" does)
- Now possible to scope to timed modifiers in localisation. For example, if ROOT is a character, [Root.modifier_name.GetExpiryDate] would show the expiry date of the modifier. If no such modifier is present, nothing gets shown. Also supports "GetName"
- random_direct_de_jure_vassal_title now exists. Works like any_direct_de_jure_vassal_title, except picks one at random
- Fixed start_date and current_date checking that the days are equal rather than equal or greater
- All numerical triggers now support comparison operators (>=, <=, <, >, and ==) with a few exceptions: tier triggers, among_most_powerful_vassals. These exceptions are due to operation triggers breaking existing behavior (E.G., "tier = duke" isn't equivalent to "tier >= duke", which the comparison operators assume)
- Added "unsafe_destroy_artifact" effect, which can destroy indestructible artifacts
- Artifact localisation (E.G., name and desc) now provides the artifact as From
- The artifact activation and gift triggers now provide the artifact as From
- Added support for "else_if" and "else". If one of these is placed after an "if" or "else_if", it will be executed if the "if"/"else_if" limit returns false. Example:
if = { limit = { something = yes } do_something = yes }
else_if = { limit = { something_else = yes } do_something_else = yes }
else = { do_another_thing = yes }
- Added trigger "artifact_can_be_gifted_to = ROOT", which checks if the artifact currently scoped to can be gifted to the target character
- Now possible to specify "sound = no" for death reasons, which will prevent killing someone with that reason causing a death sound
- Fixed FROMFROM (the holding title) not always being available in the building trigger
- Fixed whatever character is FROM getting included in event option portrait lists if you scope to something that isn't a character
- Improved the error messages for the reload_texture command, and made it more forgiving when it comes to "/" vs. "\\" and ".dds" vs. ".tga". Also fixed it in some cases crashing. Generally, simply copying the path specified in the .gfx file should work
- Added COST_COMBAT_RATING define for specifying the cost of combat rating in the ruler designer
- Added unsafe_impregnate and unsafe_impregnate_cuckoo effects. These can impregnate someone who is already pregnant, while the two old effects are no longer able to do so
- Added a fail_trigger_effect field for events. This effect is triggered if script attempts to trigger an event, but the trigger isn't fulfilled. Useful for handling things like one character in a chain dying for unrelated reasons partway through the chain
- Fixed not all parts of the society rank tooltip having the appropriate scopes set
- spawn_unit can now take "province = closest_to_capital", which will spawn as close to the character's capital as possible
- The "debug_mode" console command (AKA "charinfo") will now also show extra information about titles
- The hardcoded opinion penalty for being imprisoned now references "opinion_imprisoned" rather than "opinion_arrest_attempt"
- The "damage_unit" effect can now take negative numbers in order to heal units instead
- Added "is_artifact_equipped" trigger, which can be used in an artifact scope
- Insults and compliments now provide the giver and receiver in localisation. The giver is FROM, while the receiver is ROOT
- The game will now log titles and provinces for which no localisation exists
- The "set_name" effect now works on artifacts (before only worked on characters, titles, and provinces)
- The "set_name" effect can now take a scope of the same type as the thing being renamed. E.G., if you're renaming a character, "set_name = ROOT" will work if ROOT is also a character, and take their name. Note that for artifacts this will use the name *after* processing localisation, so all custom loc will become static upon doing so
- Custom loc is now resolved when using the "set_name" effect, so something like 'set_name = "[This.Religion.GetRandomEvilGodName]"' will work
- Fixed resetting title names with "set_name" not causing it to take its cultural name
- The "create_title" effect can now take "short_name = yes". This will suppress "Empire of" and similar from the name of the title, just like it does when defining a static landed title
- Added define SEND_ARTIFACT_GREED_MULT
- If you set the character flag "no_court_invites" on someone, they now become impossible to invite to court. Useful for characters you want to ensure stay in a specific court
- Added on actions on_eu4_conversion_start and on_eu4_conversion_done. Can be used to prepare the gamestate for EU4 conversion, then restore the original state
- Added on_tyranny_gained and on_tyranny_gained_tyrant_only on-actions
- When debug_mode (AKA charinfo) is active, hovering over an event will now provide a list of all event targets set, and what each scope corresponds to
- Added "log_scopes" effect, which records the above information in game.log. Like the "log" effect, only logs if the game is started with the "-scriptlog" parameter
- Added "GetScopes" property for scopes in loc. This will show the same info as "log_scopes". Note that it only works in scopes; once you've promoted to a specific entity (E.G., a character), scope properties are unavailable
- Fixed the war scope not always being available in CB script when you'd expect it to be (E.G., after scoping to "ROOT")
- Fixed negative society currency gains not showing up in the gain tooltip
- Added the following relation triggers:
is_parent_of = ROOT
is_cousin_of = ROOT
is_aunt_uncle_of = ROOT
is_nibling_of = ROOT - Checks niece/nephew
is_grandparent_of = ROOT
is_grandchild_of = ROOT
is_descendant_of = ROOT - Checks if the scoped character descends from the ROOT. No limit on how far removed. Expensive, so use with care. Limited to 16 generations of removal for performance reasons
is_ancestor_of = ROOT - Checks if ROOT descends from the scoped character. No limit on how far removed. Expensive, so use with care. Limited to 16 generations of removal for performance reasons
- set_preferred_capital now works on static titles as well, not just dynamic ones
- Added "capital" title history effect, which sets the preferred capital of the title
- "show_portrait" can now take a scope or similar. E.G., "show_portrait = ROOT" will show ROOT, while "show_portrait = offmap_china" will show the emperor of China. The right-hand-side can be a scope, a title, or an offmap power
- Added a "portrait" parameter to events, which determines which character is shown in the upper-right corner. For example "portrait = offmap_china" will cause the Chinese Emperor to be shown
- Added trade_route_control trigger. Example:
trade_route_control = {
trade_route = silk_road # What trade route to check against
value > 0.1 # What percentage needs to be owned. Takes comparison operators
type = trade_post_locations # What to compare. Takes wealth, provinces, trade_posts, and trade_post_locations. The latter two are restricted by the trade post trigger in the trade route definition. Defaults to wealth if not set
indirectly_owned = no # Whether to include provinces in one's sub-realm that are owned by vassals. Defaults to yes if not set
}
- Added alias for vassal_or_below trigger called liege_or_above_of.
- Added alias for liege_or_above trigger called vassal_or_below_of.
- Added decision filters independent_rulers and independent_rulers_including_me
- Added decision filter close_relatives. Includes children, grandchildren, parents, siblings, and niblings
- The "female" paramenter in create_character can now take "random" or a number between 0 and 100 in order to get a random chance of the person being a woman. E.G., "female = 42"
- Added any_pupil and random_pupil scopes. Scopes to characters you're educating
- monthly_character_prestige and liege_prestige (and the piety versions) now work for forts and trade posts as well
- Forts and trade posts can now give tech spread bonuses
- pdx_tooltip and pdx_tooltip_delayed now work in far more places than before
- Fixed religious names not checking the cultural base name in create_character, unlike character birth
- Fixed the spouses of characters who don't get their title (E.G., "Count") in their name getting the title in their name
- Virtually anything that works as a scope on the left-hand-side (E.G., "educator = {") now works as a scope on the right-hand-side (E.G., "= educator") for triggers and effects that support more than just relative scoping (ROOT, FROM, etc. and event targets)
- Now possible to scope to religions, cultures, and their groups. E.G., "norse = {". Note that for the groups, this simply scopes to the first culture/religion in the group, not the actual group itself
- Added "can_use_cb" trigger, which checks everything in the CB itself, plus the extra hardcoded restrictions on regular war declarations. Basically, checks if the war would show up and be usable from the UI. Example:
can_use_cb = {
target = d_mecklemburg # What character to target. Can also take titles
casus_belli = religious # What CB to use
thirdparty_title = d_mecklemburg # What title to target, if relevant
#thirdparty = FROM # What character to declare on the behalf of, if relevant
}
- Ensured that effects work even if some of the systems they rely on haven't loaded yet when they're first read. This was already the case for triggers
- Added is_or_was_offmap_power_ruler trigger
- Fixed a bunch of decision related triggers having their tooltip logic inverted (E.G., saying "Can NOT take decision" when it should say "Can take decision")
- Added parameters attacker_unoccupied_warscore and defender_unoccupied_warscore. See 00_cb_types.txt for documentation
- Fixed plot start date not being saved, meaning that the "plot_months" trigger would be wrong after saving and loading
- Fixed the destroy_artifact effect causing the game to crash on launch if used somewhere where the artifact database has yet to be initialized
- Diplomatic interaction on-action events now provide the starting scope (normally, the actor) as FROMFROM so that you have a way to get back to the actor after scoping to someone else
- The "while" effect now supports the "count" parameter, which determines how many times it loops. E.G., "count = 10" means it will loop until the limit is no longer met, or it has been executed 10 times, whichever happens first
- Fixed scope changes sometimes resulting in improper seeding. E.G., if you scoped to FROM inside any_realm_title, any randomness would be identical
- Fixed casus belli effect execution not being seeded, so the same randomness would always occur if conditions were similar enough
- Fixed the "is_lowborn" trigger checking the opposite of what it should; "is_lowborn = yes" used to check that you're part of a dynasty rather than not part of one
- Added any_tributary and random_tributary scopes
- Added player_heir scope, which scopes to the character shown on your character sheet rather than whoever is heir to your primary title
- The on_war_ended on-actions now provide the war in question, meaing that war triggers and effects like "using_cb" and "any_attacker" will work, similarly to how they work in CBs
- create_title will now pick a color at random if there's no base title, rather than always making the map color white
- Added set_description effect, which changes the description of an artifact to the given string/loc key
- Added can_inherit government parameter. Defaults to yes. If set to no, characters with this government cannot inherit titles
- The following opinion modifiers now work in all modifiers: rel_head_opinion, child_opinion, dynasty_opinion, female_dynasty_opinion, male_dynasty_opinion
- In effect fields custom_tooltip will now always properly hide the tooltip of nested effects.
- Added "window" attribute for events, which specifies the name of a GUI window to use, meaning an event can be given virtually any look. Specifying the "background" parameter will also apply that GFX name + "_option" to the option buttons if GFX by that name exists
- Fixed clear_delayed_event not working on provinces if the event in question is a narrative_event or similar rather than explicitly a province event
- Having fewer than 7 baronies defined for a county should no longer risk crashing the game
- Added max_attacker_battle_score and max_defender_battle_score CB parameters, which override the relevant define if set
- The "government" trigger can now also take a scope as its right-hand-side. E.G., "government = ROOT" or "government = k_norway". It will compare to the government of the character the scope corresponds to
- Added capturing_defender_is_complete_victory and capturing_attacker_is_complete_victory CB parameters. Default to "yes". If set to "no", capturing the defender/attacker is not automatic victory, but instead gives CAPTURED_HEIR_WAR_SCORE warscore
- Added "display_on_map" parameter to job actions, which can be used to override the color of the job action when assigning it, and providing a tooltip, based on a trigger. As many such sections can be added as desired; the first that evaluates to true will be used. If none are defined, or if none evaluate true, the default green color is used. The special colors are only used if the job action itself can be used. The tooltip will be run through custom loc with the same scopes as the trigger. Example:
display_on_map = {
tooltip = JOB_PROSELYTIZE_DIFFERENT_RELIGION # Key of the loc to add to the tooltip
trigger = { # Trigger for when this should happen. Same scopes as the allow/potential for the job action itself
NOT = { religion = FROM }
}
color = { 255 0 0 } # What color to use on the map
}
- Added logging at game start if there are living characters who lack a culture or religion
- Fixed not all event targets working with custom loc (E.G., artifacts)
- All notifications now have custom loc scope available. Those that didn't use to now have FROM as the "sender" of the notification, and ROOT as the player
- Added government parameters can_grant_kingdoms_and_empires_to_other_government_group and can_be_granted_kingdoms_and_empires_by_other_government_group for governments. Changed the defaults so that by default governments can grant within a group, and receive from anyone
- Added AI flags "ai_flag_refuse_marriage" and "ai_flag_refuse_concubinage". If set, the AI will never marry the character off or accept them being made into a concubine, except if they're the person the character is getting married to/made consort of
- Added logging for buildings that are built while their pre-requisites or the building they upgrade from is missing
- Added artifact_age and has_known_creation_date triggers
- Added set_looter_hostility_days effect, which can be used to force a specific time of looter hostility, including 0 in order to remove looter hostility
- Added "debug_events" console command. After running this, the game will keep track of how many times each event has fired. This can be printed to the game folder (wherever the CK2 .exe is) using "debug_dumpevents"
- Fixed scoping in custom loc working very inconsistently with script scoping at times. Most importantly, this means that "Root" will no longer be undefined after scoping to something else, so something like "From.GetRootRelation" should now always work
- Fixed indentation in random_list tooltips not working properly if there's more than one effect within a single entry
- Fixed provinces getting duplicate or no names in cases where "external" provinces are defined in any spot other than dead last in the province list
- If you disable the prestige hit from unlanded sons for a tier, that tier will no longer get the unlanded sons alert
- Fixed scoping to job titles looking really ugly in tooltips
- Made the error messages when wrong names are used for a number of effects and triggers easier to understand
- Fixed it being possible to accidentally make everyone in the world allied when using add_alliance
- Added logging when you in history put a date entry within another date entry, since this is invalid and won't work. Can also help detect malformed script in some cases
- Fixed portraits not showing up in trigger switches
- Ensured that a fake war exists for tooltip purposes before declaring a war, so you can scope to the attacker and defender in the tooltips
- Fixed the graphical_culture trigger crashing the game if an invalid graphical culture was used
- Added effect_even_if_dead history effect for characters. Will be run even after the character's death, unlike "effect"
- Fixed the "new_character" scope in some cases not persisting when saving and reloading
- Fixed missing newline at end of destroy_tradepost, destroy_fort, and destroy_hospital effect
- random_list entries below 0 due to modifiers are now simply counted as 0 rather than a negative number
- Fixed it being possible for the artifact name in the "Gift Artifact" interaction to go out of bounds for very long artifact names
- Including a mesh that doesn't exist in a .GFX file should no longer crash the game. Means that for example reapers_due_dlc.gfx can be modded without crashing the game for users without The Reaper's Due
- The opening text for diplomatic events now supports custom loc, with Root being the receiver and From being the sender
- Ensured no longer possible governments cannot persist for more than a month after invalidation (E.G., due to changed culture)
- set_government_type now forces immediate government validation after setting the government. This essentially means the character must meet the potential for the government you set
- Tech point bonuses now work in all holding types, not just normal holdings and hospitals
- The "is_married" pre-trigger now only returns true if the character has a living spouse. Before also returned true if spouse was dead
- The game will no longer log errors about missing images or sounds for events disabled due to lack of DLC
- Your designated regent is no longer reset upon a regency starting. For example, this means you no longer have to reassign your regent after going on Hajj
- Fixed the "trade_route" trigger having no localisation
- Added "assassination_interaction_trigger" scripted trigger for the Assassinate diplomatic action
- Fixed diplomatic responses in some cases showing you rather than the person responding to you
- Made it clear that rulers without a scripted dynasty will get one generated at gamestart. Now has "Unknown" dynasty rather than "Lowborn" on the campaign startup screen
- Fixed income from tributaries not counting towards "yearly_income" triggers and similar
- Fixed using export_to_variable not working on global and local variables
- The "capital" character history effect now actually works to set a character's capital. Before it had no effect
- Fixed the on-start capital validation overriding the current capital for people who don't have a preferred capital
- Fixed force_host normally resulting in the host simply resetting to one's liege/own court a day later
- The secret_religious_cult scope now works even if the character does not have a secret religion; it'll now always refer to their true religion instead (secret religion if they have one, otherwise public religion)
- Added could_be_parent_of trigger, which checks if the scoped character is in the right age range to be the parent of the target character. This means that they're at least AGE_OF_MARRIAGE_MALE years older, and at most MAX_CHILD_BIRTH_AGE years older if female (for immortal characters, as long as they became immortal before this age they bypass the check). It also checks that they didn't die before the birth date of the target
- Fixed a number of scopes (one example: the target of factions) being unlocalized
- Fixed a missing linebreak in the betrothal and marriage interaction tooltips
- Fixed broken betrothals appearing as marriages on the character screen until the screen is refreshed. Now the character listing disappears entirely
- Fixed new campaigns in rare cases starting with alerts about council job assignments
- Fixed matrilineal betrothals and marriages saying they're disallowed by at least one party even when they're not
- Fixed nomad titles that should be dynastically named not being so on the character selection screen, instead changing names once the campaign starts
- Ensured custom loc referenced from hardcoded loc properties (E.G., GetPlayerRelation) get processed
- Ensured custom loc works in the tooltip for dead characters
- Added on-actions on_revoke_attempted_started_war, on_retract_vassal_attempted_started_war, on_absorb_clan_attempted_started_war, and on_split_clan_attempted_started_war
- Added join_crusade_if_bordering_hostile parameter for religions. If set to yes, the AI won't refrain from joining a crusade simply because it borders a heathen/heretic realm

That’s all for today.
Next week, Rageair will be back with the rest of the 2.8 changelog and a list of the achievements added in Jade Dragon.
 
Last edited:
Is there any hopes you can add in an Opinion modifier for a Dynasty that cares about Dynasty?

I've been trying to mod into the game a Dynastic 'feud' system where character's opinion of another character is dependent on dynasty.

More specifically, every time someone is assassinated or disinherited, I want all members of that dynasty to slowly build up negative opinion of the offending dynasty. While I can scope to all members of a dynasty, there's no way to 'retain' the information for when new characters are born.

EDIT: For those interested in the mod
https://forum.paradoxplaza.com/forum/index.php?threads/dynastic-feuds-new-feature-request.1006557/
 
Last edited:
Is there any hopes you can add in an Opinion modifier for a Dynasty that cares about Dynasty?

I've been trying to mod into the game a Dynastic 'feud' system where character's opinion of another character is dependent on dynasty.

More specifically, every time someone is assassinated or disinherited, I want all members of that dynasty to slowly build up negative opinion of the offending dynasty. While I can scope to all members of a dynasty, there's no way to 'retain' the information for when new characters are born.

That would be interesting.
 
- Cultures can now have "dynasty_name_first = yes" which puts the dynasty name before the personal name

Which is exclusive to the tooltip? Regardless, don't you think it would be more important to have an option of putting forename before the title for certain cultures?
 
I'm going to go goggle-eyed reading all that. If a wall of text can impressed, count me so.
 
I hope the achievements are a bit more challenging than "die from the Black Death" or "join a Society".
 
So can there be multiple offmap powers, each with their own interaction interface? It would be really helpful if we could mod in more than one without having to introduce any contrived new mechanics to allow them to be interacted with separately.
 
Would the Aztec Empire be also regarded as an offmap power?
 
Would the Aztec Empire be also regarded as an offmap power?

I suspect not, but nevertheless it would be good to make it that way. Throwing in the Incas as a third one would also be fascinating as a foil to the Aztecs. That way the "Aztec Empire" can be a kind of Western Protectorate title and the Emperor can remain in Tenochtitlan instead of coming over to live in Europe.

Having all three would also have the advantage of portraying all five cradles of civilisation (Andean America, Mesoamerica, Egypt, Mesopotamia and China) in an interactive way. For people who enjoy having an Aztec Invasion interrupt their blobbing games it would be especially fun to have to contend with three of them as late game superpowers.
 
Which is exclusive to the tooltip? Regardless, don't you think it would be more important to have an option of putting forename before the title for certain cultures?

I personally think a [Dynasty Name] [Personal name] order is way more important. Also for European cultures like Hungarian which use the same system. It's just weird to have them and Chinese use Western name order.

So can there be multiple offmap powers, each with their own interaction interface? It would be really helpful if we could mod in more than one without having to introduce any contrived new mechanics to allow them to be interacted with separately.

Already confirmed there can be multiple ones.
 
So can there be multiple offmap powers, each with their own interaction interface? It would be really helpful if we could mod in more than one without having to introduce any contrived new mechanics to allow them to be interacted with separately.
Yes, you can have as many as you want.
 
Which is exclusive to the tooltip? Regardless, don't you think it would be more important to have an option of putting forename before the title for certain cultures?

You mean "<first name> King <last name>"? Which cultures use that format?
 
Yes, you can have as many as you want.

Thank you - I'm very grateful for you to making this system so open and easy to use.

You mean "<first name> King <last name>"? Which cultures use that format?

Probably not the King, but for lesser nobles. It's quite common in the English peerage (ie. John, 2nd Duke of Norfolk) often followed by their lesser titles (Marquess, Earl, Viscount, Baron in that order). I'm not sure if it was done widely in the game's timeline though. Their last name would generally not be mentioned as nobles tended to be referred to by their title rather than their family name.
 
So can there be multiple offmap powers, each with their own interaction interface? It would be really helpful if we could mod in more than one without having to introduce any contrived new mechanics to allow them to be interacted with separately.
Exactly, yes.
 
Thank you - I'm very grateful for you to making this system so open and easy to use.



Probably not the King, but for lesser nobles. It's quite common in the English peerage (ie. John, 2nd Duke of Norfolk) often followed by their lesser titles (Marquess, Earl, Viscount, Baron in that order). I'm not sure if it was done widely in the game's timeline though. Their last name would generally not be mentioned as nobles tended to be referred to by their title rather than their family name.

If so it should be 'John Winston, 2nd Duke of Norfolk' and not 'John, 2nd Duke of Norfolk, Winston'
 
If so it should be 'John Winston, 2nd Duke of Norfolk' and not 'John, 2nd Duke of Norfolk, Winston'

Indeed, I'm trying to dig out some more contemporary examples as the 1st Duke of Norfolk lived in the 14th Century. Depending on size limitations (because some titles do bloat to complete excess on mouseover) I'd settle for "John, 2nd Duke of Norfolk" over "Sir John de Mowbray, 2nd Duke of Norfolk" for pragmatic reasons. I think if you insist on calling people exactly what they were called then you run into the ongoing issue of certain titles like Flanders and Antioch being wrong (should be Counties, not Duchies). It also makes me wonder (given that these people were usually knights) whether introducing more mention of knighthood and chivalry into the game would be a viable DLC topic, which could be coupled with more holy order flavour.

Exactly, yes.

Thanks, and one final question - is it possible for these titles to be activated/deactivated mid-game, or are they permanently there?
 
Last edited: