From 1b43124d39b6b2e43f4c124a6e915e30e18f6761 Mon Sep 17 00:00:00 2001 From: iht Date: Sun, 5 Jan 2025 16:21:25 +0100 Subject: [PATCH 01/13] Update removable_file_blocks_tfe.txt --- .../removable_file_blocks_tfe.txt | 97 ++++++++++++++----- 1 file changed, 72 insertions(+), 25 deletions(-) diff --git a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt index 797d2e48a..65e88949c 100644 --- a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt +++ b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt @@ -53,6 +53,41 @@ # Other { #### Starting events stuff + if = { + limit = { + game_start_date = 361.11.17 + } + character:145237 = { + add_character_flag = { + flag = immune_to_disease + years = 5 + } + } + character:145232 = { + add_character_flag = { + flag = immune_to_disease + years = 5 + } + } + character:145231 = { + add_character_flag = { + flag = immune_to_disease + years = 5 + } + } + } + if = { + limit = { + game_start_date = 361.11.17 + title:e_roman_empire.holder = character:145237 + } + character:145237 = { + trigger_event = { + id = western_roman.0081 + days = 2 + } + } + } if = { limit = { game_start_date = 395.1.17 @@ -1592,6 +1627,9 @@ title:e_byzantium.holder ?= { add_gold = 1000 } + character:200290 = { + remove_claim = title:d_muntenia + } character:balamer_01 ?= { add_prestige = 3000 spawn_army = { @@ -2359,11 +2397,13 @@ # Restore the main branch of the Vakataka Dynasty reclaim_vakataka_decision = { - picture = "gfx/interface/illustrations/decisions/decision_dynasty_house.dds" + picture = { + reference = "gfx/interface/illustrations/decisions/decision_dynasty_house.dds" + } + decision_group_type = major desc = reclaim_vakataka_decision_desc selection_tooltip = reclaim_vakataka_decision_tooltip - major = yes ai_check_interval = 120 @@ -2388,7 +2428,7 @@ reclaim_vakataka_decision = { is_valid_showing_failures_only = { is_available_adult = yes - is_landed = yes + is_landed_or_landless_administrative = yes } cost = { @@ -2435,17 +2475,19 @@ reclaim_vakataka_decision = { { #Restore the Three Crowned Kings muvendhar_restoration_decision = { - picture = "gfx/interface/illustrations/decisions/decision_dynasty_house.dds" + picture = { + reference = "gfx/interface/illustrations/decisions/decision_dynasty_house.dds" + } + decision_group_type = cultural desc = muvendhar_restoration_decision_desc selection_tooltip = muvendhar_restoration_decision_tooltip - major = yes ai_check_interval = 120 is_shown = { is_ruler = yes - is_landed = yes + is_landed_or_landless_administrative = yes OR = { culture = culture:tamil culture = culture:malaiya @@ -2524,10 +2566,12 @@ muvendhar_restoration_decision = { "common\decisions\TFE_rome_decisions.txt" = { { recall_belisarius = { - picture = "gfx/interface/illustrations/decisions/decision_roman_knight.dds" - major = yes + picture = { + reference = "gfx/interface/illustrations/decisions/decision_roman_knight.dds" + } + decision_group_type = roman - ai_check_interval = 12 + ai_check_interval = 6 desc = recall_belisarius_desc selection_tooltip = recall_belisarius_tooltip @@ -2539,18 +2583,13 @@ recall_belisarius = { target = flag:recall_belisarius } } - OR = { - root = global_var:justinian - has_trait = paranoid - } + #OR = { + # root = global_var:justinian + # has_trait = paranoid + #} has_global_variable = vandalic_war_won current_date >= 530.1.1 current_date <= 600.1.1 - character:belisarius_001 = title:k_africae.holder - game_start_date = 532.2.1 - } - - is_valid = { OR = { has_title = title:e_byzantium has_title = title:e_roman_empire @@ -2559,6 +2598,11 @@ recall_belisarius = { title:k_africae.holder = { is_vassal_of = root } + game_start_date = 532.2.1 + } + + is_valid = { + character:belisarius_001 = title:k_africae.holder } effect = { @@ -2620,10 +2664,12 @@ recall_belisarius = { { start_amalasuntha_coup = { - picture = "gfx/interface/illustrations/decisions/decision_destiny_goal.dds" - major = yes + picture = { + reference = "gfx/interface/illustrations/decisions/decision_destiny_goal.dds" + } + decision_group_type = roman - ai_check_interval = 1 + ai_goal = yes desc = start_amalasuntha_coup_desc selection_tooltip = start_amalasuntha_coup_tooltip @@ -2712,13 +2758,14 @@ start_amalasuntha_coup = { base = 100 } } - } { vandalic_war = { - picture = "gfx/interface/illustrations/decisions/decision_vandalic_war.dds" - major = yes + picture = { + reference = "gfx/interface/illustrations/decisions/decision_vandalic_war.dds" + } + decision_group_type = roman ai_check_interval = 12 @@ -2797,7 +2844,7 @@ vandalic_war = { } ai_potential = { - is_at_war = no + always = yes } ai_will_do = { base = 100 From c11364d01376423a7bccc0ab8c7af8b8c9681505 Mon Sep 17 00:00:00 2001 From: iht Date: Sun, 5 Jan 2025 16:56:07 +0100 Subject: [PATCH 02/13] Don't preserve the DNAs of loaded CK3 characters --- ImperatorToCK3/CK3/Characters/CharactersLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImperatorToCK3/CK3/Characters/CharactersLoader.cs b/ImperatorToCK3/CK3/Characters/CharactersLoader.cs index 0b686d6cb..27d156816 100644 --- a/ImperatorToCK3/CK3/Characters/CharactersLoader.cs +++ b/ImperatorToCK3/CK3/Characters/CharactersLoader.cs @@ -33,7 +33,7 @@ public void LoadCK3Characters(ModFilesystem ck3ModFS, Date bookmarkDate) { "set_relation_ward", "set_relation_mentor", "add_opinion", "make_concubine", ]; - string[] fieldsToClear = ["friends", "best_friends", "lovers", "rivals", "nemesis", "primary_title"]; + string[] fieldsToClear = ["friends", "best_friends", "lovers", "rivals", "nemesis", "primary_title", "dna"]; foreach (var character in loadedCharacters) { // Remove post-bookmark history except for births and deaths. From 64b00e2081b85a56d92e6fb9a5ecdd7ad080694b Mon Sep 17 00:00:00 2001 From: iht Date: Sun, 5 Jan 2025 17:21:51 +0100 Subject: [PATCH 03/13] Remove undefined traits from CK3 character history --- .../CK3/Characters/CharacterCollection.cs | 19 +++++++++++++++++++ ImperatorToCK3/CK3/World.cs | 3 +++ ImperatorToCK3/Mappers/Trait/TraitMapper.cs | 2 ++ 3 files changed, 24 insertions(+) diff --git a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs index f51610ec8..72a178415 100644 --- a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs +++ b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs @@ -824,4 +824,23 @@ internal void ConvertImperatorCharacterDNA(DNAFactory dnaFactory) { } } } + + public void RemoveUndefinedTraits(TraitMapper traitMapper) { + Logger.Info("Removing undefined traits from CK3 character history..."); + + var definedTraits = traitMapper.ValidCK3TraitIDs.ToHashSet(); + + foreach (var character in this) { + if (character.FromImperator) { + continue; + } + + var traitsField = character.History.Fields["traits"]; + int removedCount = traitsField.InitialEntries.RemoveAll( + kvp => !definedTraits.Contains(kvp.Value.ToString() ?? string.Empty)); + if (removedCount > 0) { + Logger.Debug($"Removed {removedCount} undefined traits from character {character.Id}."); + } + } + } } \ No newline at end of file diff --git a/ImperatorToCK3/CK3/World.cs b/ImperatorToCK3/CK3/World.cs index 7d21ea6dd..a164e4237 100644 --- a/ImperatorToCK3/CK3/World.cs +++ b/ImperatorToCK3/CK3/World.cs @@ -243,6 +243,9 @@ public World(Imperator.World impWorld, Configuration config, Thread? irCoaExtrac Logger.Warn($"No base mapping found for I:R culture {cultureStr}!"); } } + }, + () => { // depends on TraitMapper and CK3 characters being loaded + Characters.RemoveUndefinedTraits(traitMapper); } ); diff --git a/ImperatorToCK3/Mappers/Trait/TraitMapper.cs b/ImperatorToCK3/Mappers/Trait/TraitMapper.cs index 263de70d4..a6fdeb2da 100644 --- a/ImperatorToCK3/Mappers/Trait/TraitMapper.cs +++ b/ImperatorToCK3/Mappers/Trait/TraitMapper.cs @@ -10,6 +10,8 @@ internal class TraitMapper { protected IDictionary ImperatorToCK3TraitMap = new Dictionary(); protected IdObjectCollection CK3Traits = []; + public IEnumerable ValidCK3TraitIDs => CK3Traits.Select(t => t.Id); + // TODO: add a method for logging all unmapped I:R traits public TraitMapper() { } From 4b1437cadb543332b0f21df3a762065cb60412cf Mon Sep 17 00:00:00 2001 From: iht Date: Sun, 5 Jan 2025 17:33:26 +0100 Subject: [PATCH 04/13] Also removed undefined traits from dated history entries --- ImperatorToCK3/CK3/Characters/CharacterCollection.cs | 3 +-- ImperatorToCK3/CommonUtils/IHistoryField.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs index 72a178415..6e83f51bf 100644 --- a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs +++ b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs @@ -836,8 +836,7 @@ public void RemoveUndefinedTraits(TraitMapper traitMapper) { } var traitsField = character.History.Fields["traits"]; - int removedCount = traitsField.InitialEntries.RemoveAll( - kvp => !definedTraits.Contains(kvp.Value.ToString() ?? string.Empty)); + int removedCount = traitsField.RemoveAllEntries(value => !definedTraits.Contains(value.ToString() ?? string.Empty)); if (removedCount > 0) { Logger.Debug($"Removed {removedCount} undefined traits from character {character.Id}."); } diff --git a/ImperatorToCK3/CommonUtils/IHistoryField.cs b/ImperatorToCK3/CommonUtils/IHistoryField.cs index 9c3a4764a..7b651bad9 100644 --- a/ImperatorToCK3/CommonUtils/IHistoryField.cs +++ b/ImperatorToCK3/CommonUtils/IHistoryField.cs @@ -30,11 +30,14 @@ public void RemoveAllEntries() { /// Removes all entries with values matching the predicate /// /// - public void RemoveAllEntries(Func predicate) { - InitialEntries.RemoveAll(kvp => predicate(kvp.Value)); + public int RemoveAllEntries(Func predicate) { + int removed = 0; + removed += InitialEntries.RemoveAll(kvp => predicate(kvp.Value)); foreach (var datedEntriesBlock in DateToEntriesDict) { - datedEntriesBlock.Value.RemoveAll(kvp => predicate(kvp.Value)); + removed += datedEntriesBlock.Value.RemoveAll(kvp => predicate(kvp.Value)); } + + return removed; } public void RegisterKeywords(Parser parser, Date date); From 556fbbb74bcea4e36ad5fc6c2d3000cdf7cb1f15 Mon Sep 17 00:00:00 2001 From: iht Date: Sun, 5 Jan 2025 21:19:33 +0100 Subject: [PATCH 05/13] CK3 mod flags support and TFE version of invention to innovation mappings --- .../CK3/Cultures/CultureCollection.cs | 4 +- ImperatorToCK3/CK3/World.cs | 8 +- .../inventions_to_innovations_map.liquid | 270 ++++++++++++++++++ .../inventions_to_innovations_map.txt | 214 -------------- .../Mappers/Technology/InnovationMapper.cs | 14 +- 5 files changed, 289 insertions(+), 221 deletions(-) create mode 100644 ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.liquid delete mode 100644 ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.txt diff --git a/ImperatorToCK3/CK3/Cultures/CultureCollection.cs b/ImperatorToCK3/CK3/Cultures/CultureCollection.cs index cb3443017..46c01370b 100644 --- a/ImperatorToCK3/CK3/Cultures/CultureCollection.cs +++ b/ImperatorToCK3/CK3/Cultures/CultureCollection.cs @@ -215,11 +215,11 @@ public void LoadInnovationIds(ModFilesystem ck3ModFS) { return cultureMapper.Match(irCulture, ck3ProvinceId, irProvinceId, country.HistoricalTag); } - public void ImportTechnology(CountryCollection countries, CultureMapper cultureMapper, ProvinceMapper provinceMapper, InventionsDB inventionsDB, LocDB irLocDB) { // TODO: add tests for this + public void ImportTechnology(CountryCollection countries, CultureMapper cultureMapper, ProvinceMapper provinceMapper, InventionsDB inventionsDB, LocDB irLocDB, OrderedDictionary ck3ModFlags) { // TODO: add tests for this Logger.Info("Converting Imperator inventions to CK3 innovations..."); var innovationMapper = new InnovationMapper(); - innovationMapper.LoadLinksAndBonuses("configurables/inventions_to_innovations_map.txt"); + innovationMapper.LoadLinksAndBonuses("configurables/inventions_to_innovations_map.liquid", ck3ModFlags); innovationMapper.LogUnmappedInventions(inventionsDB, irLocDB); innovationMapper.RemoveMappingsWithInvalidInnovations(InnovationIds); diff --git a/ImperatorToCK3/CK3/World.cs b/ImperatorToCK3/CK3/World.cs index a164e4237..921acd9ad 100644 --- a/ImperatorToCK3/CK3/World.cs +++ b/ImperatorToCK3/CK3/World.cs @@ -134,15 +134,17 @@ public World(Imperator.World impWorld, Configuration config, Thread? irCoaExtrac () => CK3CoaMapper = new(ModFS) ); + OrderedDictionary ck3ModFlags = config.GetCK3ModFlags(); + Parallel.Invoke( () => { // depends on ck3ColorFactory and CulturalPillars // Load CK3 cultures from CK3 mod filesystem. Logger.Info("Loading cultural pillars..."); - CulturalPillars = new(ck3ColorFactory, config.GetCK3ModFlags()); + CulturalPillars = new(ck3ColorFactory, ck3ModFlags); CulturalPillars.LoadPillars(ModFS); Logger.Info("Loading converter cultural pillars..."); CulturalPillars.LoadConverterPillars("configurables/cultural_pillars"); - Cultures = new CultureCollection(ck3ColorFactory, CulturalPillars, config.GetCK3ModFlags()); + Cultures = new CultureCollection(ck3ColorFactory, CulturalPillars, ck3ModFlags); Cultures.LoadNameLists(ModFS); Cultures.LoadInnovationIds(ModFS); Cultures.LoadCultures(ModFS); @@ -213,7 +215,7 @@ public World(Imperator.World impWorld, Configuration config, Thread? irCoaExtrac var religionMapper = new ReligionMapper(Religions, imperatorRegionMapper, ck3RegionMapper); Parallel.Invoke( - () => Cultures.ImportTechnology(impWorld.Countries, cultureMapper, provinceMapper, impWorld.InventionsDB, impWorld.LocDB), + () => Cultures.ImportTechnology(impWorld.Countries, cultureMapper, provinceMapper, impWorld.InventionsDB, impWorld.LocDB, ck3ModFlags), () => { // depends on religionMapper // Check if all I:R religions have a base mapping. diff --git a/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.liquid b/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.liquid new file mode 100644 index 000000000..0a73644ad --- /dev/null +++ b/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.liquid @@ -0,0 +1,270 @@ +### INVENTIONS TO INNOVATIONS MAPPINGS ### + +# bonus = { ir = imperator invention ck3 = ck3 innovation } +# Multiple Inventions can be listed, if they conceptually contribute to the Innovation +# Working assumption: each bonus line should have no more than 3 universal and 1 cultural/regional Invention per Innovation, on the assumption that each Invention might give a 25% bonus towards the Innovation. +# link = { ir = imperator invention ck3 = ck3 innovation } +# Links are one to one. +# Working assumption: only include an Invention here if it's conceptually almost or actually identical to the Innovation (effects don't matter). +# All CK3 Innovations up to 1.12 are listed here, even if they don't make sense for conversion. +# Lines that don't have any suitable Invention should be commented out. + +# Supported CK3 mod flags for conditional blocks: +# tfe (The Fallen Eagle) +# wtwsms (When the World Stopped Making Sense) +# aep (Asia Expansion Project) +# vanilla (Vanilla CK3) + + + +{% if tfe %} # FALLEN EAGLE, credits to cycnusater from the PDX forum + + # TRIBAL ERA + link = { ir = global_defensive_inv_1 ck3 = innovation_motte } + link = { ir = siege_engineers_inv_3 ck3 = innovation_siege_towers } + link = { ir = global_tribesmen_output_inv_1 ck3 = innovation_tribal_duties } + link = { ir = global_freemen_output_inv_1 ck3 = innovation_tribal_duties } + bonus = { ir = global_start_experience_inv_3 ir = global_start_experience_inv_2 ck3 = innovation_barracks } + link = { ir = cohort_reinforcement_speed_inv ck3 = innovation_barracks } + link = { ir = military_tech_investment_inv_1 ck3 = innovation_smithing_tables } + link = { ir = oaths_of_allegiance_inv ck3 =innovation_gavelkind } + link = { ir = global_population_growth_inv_1 ck3 = innovation_crop_rotation } + link = { ir = state_trade_inv_2 ck3 = innovation_merchant_outposts } + link = { ir = global_citizen_output_inv_1 ck3 = innovation_plenary_assemblies } # 3rd Assemblies + link = { ir = global_population_growth_inv_5 ck3 = innovation_development_00 } + link = { ir = global_tax_modifier_inv_1 ck3 = innovation_currency_01 } + link = { ir = military_tech_investment_inv_2 ck3 = innovation_elephantry } + link = { ir = military_tech_investment_inv_2 ck3 = innovation_war_camels } + + # CLASSICAL ANTIQUITY ERA + link = { ir = siege_engineers_inv_4 ck3 = innovation_scorpio } + link = { ir = professional_training_inv ck3 = innovation_war_dogs } + link = { ir = global_unrest_inv_1 ck3 = innovation_tanning_tables } + link = { ir = global_tribesmen_happyness_inv ck3 = innovation_tanning_tables } + bonus = { ir = global_start_experience_inv_1 ir = global_supply_limit_modifier_inv_1 ir = heavy_infantry_discipline_inv ck3 = innovation_mustering_grounds } + link = { ir = global_cohort_recruit_speed_inv ck3 = innovation_mustering_grounds } + link = { ir = global_citizen_output_inv_1 ck3 = innvation_animal_husbandry } + link = { ir = agressive_expansion_impact_inv_3 ck3 = innovation_client_states } + link = { ir = build_cost_inv ck3 = innovation_development_01 } + link = { ir = global_building_slot_inv ck3 = innovation_city_planning } + link = { ir = war_score_cost_inv_1 ck3 = innovation_casus_belli } + link = { ir = global_population_growth_inv_2 ck3 = innovation_heavy_plow } + link = { ir = omen_power_inv_4 ck3 = innovation_imperial_faiths } + + # LATE ANTIQUITY ERA + link = { ir = siege_engineers_inv_4 ck3 = innovation_catapult } + link = { ir =gallic_chainmail_inv ck3 = innovation_quilted_armour } + link = { ir = professional_training_inv ck3 = innovation_quilted_armour } + link = { ir = heavy_cavalry_discipline_inv ck3 = innovation_equestrian_husbandry } + link = { ir = naval_rostra_inv_1 ck3 = innovation_naval_carpentry } + link = { ir = monthly_governor_wage_inv ck3 = innovation_officer_efficiency } + + +{% else %} # BASE GAME + + # TRIBAL ERA - MILITARY + bonus = { ir = fort_maintenance_cost_inv ir = global_defensive_inv_3 ir = global_defensive_inv_1 ck3 = innovation_motte } + link = { ir = siege_speed_inv_3 ck3 = innovation_motte } + bonus = { ir = siege_speed_inv_5 ir = siege_engineers_inv_5 ck3 = innovation_catapult } + link = { ir = siege_engineers_inv_4 ck3 = innovation_catapult } + bonus = { ir = global_start_experience_inv_3 ir = global_start_experience_inv_2 ck3 = innovation_barracks } + link = { ir = cohort_reinforcement_speed_inv ck3 = innovation_barracks } + bonus = { ir = global_start_experience_inv_1 ir = global_supply_limit_modifier_inv_1 ir = heavy_infantry_discipline_inv ck3 = innovation_mustering_grounds } + link = { ir = global_cohort_recruit_speed_inv ck3 = innovation_mustering_grounds } + bonus = { ir = experience_decay_inv_1 ir = general_loyalty_inv ir= tyranny_inv_2 ck3 = innovation_bannus } # 3rd Hierarchy of Responsibility + # link = { ir = ck3 = innovation_bannus } + bonus = { ir = gallic_chainmail_inv ck3 = innovation_quilted_armor } + # link = { ir = ck3 = innovation_quilted_armor } + # TRIBAL ERA - CIVIC + bonus = { ir = global_citizen_output_inv_3 ir = global_freemen_output_inv_3 ir = italic_lex_frumentaria_inv ir = global_tax_modifier_inv_3 ck3 = innovation_development_01 } + link = { ir = ruler_popularity_gain_inv_4 ck3 = innovation_development_01 } # Public Works + bonus = { ir = commerce_inv_1 ir = global_tax_modifier_inv_1 ir = commerce_inv_2 ck3 = innovation_currency_01 } + # link = { ir = ck3 = innovation_currency_01 } + # bonus = { ir = ck3 = innovation_gavelkind } + link = { ir = oaths_of_allegiance_inv ck3 =innovation_gavelkind } # IR is Codified Succession + # bonus = { ir = ck3 = innovation_crop_rotation } + # link = { ir = ck3 = innovation_crop_rotation } + bonus = { ir = italic_insulae_inv ir = italic_lex_frumentaria_inv ck3 = innovation_city_planning } + link = { ir = global_building_slot_inv ck3 = innovation_city_planning } + bonus = { ir = fabricate_claim_cost_modifier_inv ir = agressive_expansion_impact_inv_3 ir = tribute_income_modifier_inv_1 ck3 = innovation_casus_belli } # Third is Tributary Administration + link = { ir = war_score_cost_inv_1 ck3 = innovation_casus_belli } + bonus = { ir = italic_lex_frumentaria_inv ir = global_tribesmen_output_inv_2 ir = global_tribesmen_output_inv_2 ir = global_unrest_inv_5 ck3 = innovation_plenary_assemblies } # 3rd Assemblies + # link = { ir = ck3 = innovation_plenary_assemblies } + bonus = { ir = commerce_inv_5 ir = monthly_wage_inv ir = tribute_income_modifier_inv_3 ck3 = innovation_ledger } + # link = { ir = ck3 = innovation_ledger } + # TRIBAL ERA - REGIONAL + # bonus = { ir = ck3 = innovation_table_of_princes } + # link = { ir = ck3 = innovation_table_of_princes } # culture:czech|slovien + bonus = { ir = blockade_efficiency_inv ir = liburnian_invention_1 ck3 = innovation_longboats } # 1st Experienced Seafarers 2nd Lemboi Scouts (could both fight and row) + # link = { ir = ck3 = innovation_longboats } # region = world_europe_north + # bonus = { ir = ck3 = innovation_elephantry } + # link = { ir = ck3 = innovation_elephantry } # region = world_innovation_elephants + # bonus = { ir = ck3 = innovation_war_camels } + # link = { ir = ck3 = innovation_war_camels } # region = world_innovation_camels + bonus = { ir = buy_military_tradition_inv ck3 = innovation_wootz_steel } + link = { ir = indian_wootz_steel_inv ck3 = innovation_wootz_steel } # world_india_deccan + # bonus = { ir = ck3 = innovation_african_canoes } + # link = { ir = ck3 = innovation_african_canoes } # world_africa_west + # TRIBAL ERA - MEN-AT-ARMS + # bonus = { ir = ck3 = innovation_caballeros } + # link = { ir = ck3 = innovation_caballeros } # region = world_europe_west_iberia + # bonus = { ir = ck3 = innovation_bamboo_bows } + # link = { ir = ck3 = innovation_bamboo_bows } # region = world_india + # bonus = { ir = ck3 = innovation_sahel_horsemen } + # link = { ir = ck3 = innovation_sahel_horsemen } # region = custom_sahel_proper + # bonus = { ir = ck3 = innovation_repeating_crossbow } + # link = { ir = ck3 = innovation_repeating_crossbow } # has_cultural_pillar = heritage_chinese + # bonus = { ir = ck3 = innovation_pole_vault } + # link = { ir = ck3 = innovation_pole_vault } # culture:guanches OR PARENT CULTURE + # TRIBAL ERA - NORTHERN LORDS - has_fp1_dlc_trigger = yes + bonus = { ir = assemble_raiding_inv ck3 = innovation_varangian_adventurers } # 1st Experienced Raiders (Tribal only) + # link = { ir = ck3 = innovation_varangian_adventurers } # ( has_cultural_pillar = heritage_north_germanic OR Norman culture OR Estonian culture ) BUT NOT EARLY MEDIEVAL OR LATER + bonus = { ir = agressive_expansion_monthly_decay_inv_1 ck3 = innovation_all_things } + # link = { ir = ck3 = innovation_all_things } # region = world_europe_north + + # EARLY MEDIEVAL ERA - MILITARY + # bonus = { ir = ck3 = innovation_battlements } + # link = { ir = ck3 = innovation_battlements } + bonus = { ir = siege_speed_inv_1 ck3 = innovation_mangonel } + link = { ir = siege_engineers_inv_6 ck3 = innovation_mangonel } + bonus = { ir = gallic_oppidum_inv ir = siege_speed_inv_4 ir = civic_tech_investment_inv_1 ck3 = innovation_burhs } + # link = { ir = ck3 = innovation_burhs } + bonus = { ir = global_start_experience_inv_4 ck3 = innovation_house_soldiers } + # link = { ir = ck3 = innovation_house_soldiers } + # bonus = { ir = ck3 = innovation_horseshoes } + # link = { ir = ck3 = innovation_horseshoes } + bonus = { ir = gallic_four_horned_saddle_inv ir = heavy_cavalry_discipline_inv ck3 = innovation_arched_saddle } + # link = { ir = ck3 = innovation_arched_saddle } + # EARLY MEDIEVAL ERA - CIVIC + bonus = { ir = monthly_character_loyalty_inv_2 ir = dictatorship_step_3 ir = dictatorship_step_4 ck3 = innovation_hereditary_rule } # 1st Approved Familia 2nd and 3rd are Demand/Request a Line of Succession which are alternatives for Dictatorship + # link = { ir = ck3 = innovation_hereditary_rule } # UNLOCKS PARTITION + bonus = { ir = global_goods_from_slaves_inv ck3 = innovation_manorialism } + link = { ir = global_settlement_building_slot_inv ck3 = innovation_manorialism } + bonus = { ir = smear_character_cost_modifier_inv ck3 = innovation_development_02 } # 1st Town Criers + # link = { ir = ck3 = innovation_development_02 } # Communal Government + bonus = { ir = hold_triumph_cost_modifier_inv ck3 = innovation_currency_02 } + link = { ir = coins_inv ck3 = innovation_currency_02 } # Coinage + link = { ir = brass_coinage_inv ck3 = innovation_currency_02 } # Coinage + bonus = { ir = loyalty_gain_chance_modifier_inv ir = agressive_expansion_monthly_decay_inv_4 ck3 = innovation_royal_prerogative } + # link = { ir = ck3 = innovation_royal_prerogative } + bonus = { ir = land_won_by_the_spear ir = religious_tech_investment_inv_1 ck3 = innovation_chronicle_writing } # 2nd Recording Tradition + # link = { ir = ck3 = innovation_chronicle_writing } + bonus = { ir = indian_trigonometric_functions_inv ck3 = innovation_armilary_sphere } + # link = { ir = ck3 = innovation_armilary_sphere } + bonus = { ir = tyranny_inv_1 ir = religious_tech_investment_inv_2 ck3 = innovation_baliffs } # 1st Official Orators 2nd Scribae + # link = { ir = ck3 = innovation_baliffs } # (sic) bailiffs + # EARLY MEDIEVAL ERA - REGIONAL + # bonus = { ir = ck3 = innovation_reconquista } + # link = { ir = ck3 = innovation_reconquista } # region = world_europe_west_iberia + # bonus = { ir = ck3 = innovation_stem_duchies } + # link = { ir = ck3 = innovation_stem_duchies } # region = custom_europe_western_germany + # bonus = { ir = ck3 = innovation_ghilman } + # link = { ir = ck3 = innovation_ghilman } # region = world_middle_east_arabia + # link = { ir = ck3 = fp3_innovation_mural_sextant } REQUIRES DLC AND COURT SCHOLAR + + + # HIGH MEDIEVAL ERA - MILITARY + # bonus = { ir = ck3 = innovation_hoardings } + # link = { ir = ck3 = innovation_hoardings } + # bonus = { ir = ck3 = innovation_trebuchet } + # link = { ir = ck3 = innovation_trebuchet } + # bonus = { ir = ck3 = innovation_castle_baileys } + # link = { ir = ck3 = innovation_castle_baileys } + # bonus = { ir = ck3 = innovation_men_at_arms } + # link = { ir = ck3 = innovation_men_at_arms } + # bonus = { ir = ck3 = innovation_knighthood } + # link = { ir = ck3 = innovation_knighthood } + # bonus = { ir = ck3 = innovation_advanced_bowmaking } + # link = { ir = ck3 = innovation_advanced_bowmaking } + # HIGH MEDIEVAL ERA - CIVIC + # bonus = { ir = ck3 = innovation_heraldry } + # link = { ir = ck3 = innovation_heraldry } + # bonus = { ir = ck3 = innovation_windmills } + # link = { ir = ck3 = innovation_windmills } + bonus = { ir = agressive_expansion_impact_inv_5 ck3 = innovation_divine_right } # 1st Divine Mandate + # link = { ir = ck3 = innovation_divine_right } + # bonus = { ir = ck3 = innovation_land_grants } + # link = { ir = ck3 = innovation_land_grants } + # bonus = { ir = ck3 = innovation_scutage } + # link = { ir = ck3 = innovation_scutage } + # bonus = { ir = ck3 = innovation_guilds } + # link = { ir = ck3 = innovation_guilds } + # bonus = { ir = ck3 = innovation_development_03 } + # link = { ir = ck3 = innovation_development_03 } # Urbanization + # bonus = { ir = ck3 = innovation_currency_03 } + # link = { ir = ck3 = innovation_currency_03 } # Banking + # HIGH MEDIEVAL ERA - REGIONAL + # bonus = { ir = ck3 = innovation_east_settling } + # link = { ir = ck3 = innovation_east_settling } # region = custom_europe_eastern_germany + # bonus = { ir = ck3 = innovation_seigneurialism } + # link = { ir = ck3 = innovation_seigneurialism } # region = world_europe_west_francia + # bonus = { ir = ck3 = innovation_muladi } + # link = { ir = ck3 = innovation_muladi } # region = world_africa_north + bonus = { ir = subject_opinions_inv_3 ck3 = innovation_french_peerage } + # link = { ir = ck3 = innovation_french_peerage } # region = world_europe_west_francia AND UNLOCKED BY DECISION + # bonus = { ir = ck3 = innovation_sanitation } + # link = { ir = ck3 = innovation_sanitation } # has_cultural_pillar = heritage_byzantine OR has_cultural_pillar = heritage_arabic IN LEGENDS OF THE DEAD FILE BUT NOT ACTUALLY DLC-LOCKED?? + # HIGH MEDIEVAL ERA - MEN-AT-ARMS + # bonus = { ir = ck3 = innovation_desert_tactics } + # link = { ir = ck3 = innovation_desert_tactics } # has_innovation = innovation_desert_tactics CIRCULAR POTENTIAL + # bonus = { ir = ck3 = innovation_hobbies } + # link = { ir = ck3 = innovation_hobbies } # region = ghw_region_britannia + # bonus = { ir = ck3 = innovation_sarawit } + # link = { ir = ck3 = innovation_sarawit } # has_cultural_parameter = unlock_sarawit_innovation + + # LATE MEDIEVAL ERA - MILITARY + # bonus = { ir = ck3 = innovation_machicolations } + # link = { ir = ck3 = innovation_machicolations } + # bonus = { ir = ck3 = innovation_bombard } + # link = { ir = ck3 = innovation_bombard } + # bonus = { ir = ck3 = innovation_royal_armory } + # link = { ir = ck3 = innovation_royal_armory } + # bonus = { ir = ck3 = innovation_standing_armies } + # link = { ir = ck3 = innovation_standing_armies } + # bonus = { ir = ck3 = innovation_sappers } + # link = { ir = ck3 = innovation_sappers } + # bonus = { ir = ck3 = innovation_plate_armor } + # link = { ir = ck3 = innovation_plate_armor } + # LATE MEDIEVAL ERA - CIVIC + # bonus = { ir = ck3 = innovation_primogeniture } + # link = { ir = ck3 = innovation_primogeniture } + bonus = { ir = global_defensive_inv_5 ck3 = innovation_cranes } + # link = { ir = ck3 = innovation_cranes } + # bonus = { ir = ck3 = innovation_noblesse_oblige } + # link = { ir = ck3 = innovation_noblesse_oblige } + # bonus = { ir = ck3 = innovation_rightful_ownership } + # link = { ir = ck3 = innovation_rightful_ownership } + # bonus = { ir = ck3 = innovation_ermine_cloaks } + # link = { ir = ck3 = innovation_ermine_cloaks } + # bonus = { ir = ck3 = innovation_court_officials } + # link = { ir = ck3 = innovation_court_officials } + # bonus = { ir = ck3 = innovation_development_04 } + # link = { ir = ck3 = innovation_development_04 } # Renaissance Thought + # bonus = { ir = ck3 = innovation_currency_04 } + # link = { ir = ck3 = innovation_currency_04 } # Promissory Notes + # LATE MEDIEVAL ERA - REGIONAL + # bonus = { ir = ck3 = innovation_wierdijks } + # link = { ir = ck3 = innovation_wierdijks } # region = custom_netherlands + # bonus = { ir = ck3 = innovation_condottieri } + # link = { ir = ck3 = innovation_condottieri } # region = world_europe_south_italy + # bonus = { ir = ck3 = innovation_deccan_unity } + # link = { ir = ck3 = innovation_deccan_unity } # region = world_india_deccan + # LATE MEDIEVAL ERA - REGIONAL + bonus = { ir = indian_tube_drawn_technology_inv ir = global_citizen_happyness_inv ck3 = fp3_innovation_fritware } # 2nd Glass Blowing + # link = { ir = ck3 = fp3_innovation_fritware } REQUIRES DLC AND COURT SCHOLAR + # LATE MEDIEVAL ERA - MEN-AT-ARMS + # bonus = { ir = ck3 = innovation_zweihanders } + # link = { ir = ck3 = innovation_zweihanders } # region = ghw_region_germany && has_cultural_pillar = heritage_central_germanic + # bonus = { ir = ck3 = innovation_adaptive_militia } + # link = { ir = ck3 = innovation_adaptive_militia } # has_cultural_parameter = unlock_adaptive_militia_innovation + # bonus = { ir = ck3 = innovation_valets } + # link = { ir = ck3 = innovation_valets } # has_cultural_parameter = unlock_valets_innovation + # bonus = { ir = ck3 = innovation_pike_columns } + # link = { ir = ck3 = innovation_pike_columns } # has_cultural_parameter = unlock_innovation_pike_columns + bonus = { ir = discipline_inv_5 ir = discipline_inv_2 ir = military_tech_investment_inv_2 ck3 = innovation_legionnaires } # 1st Cohorts 2nd Manipular Legion 3rd Praefactus Fabrum + # link = { ir = ck3 = innovation_legionnaires } # culture:roman + # bonus = { ir = ck3 = innovation_rectilinear_schiltron } + # link = { ir = ck3 = innovation_rectilinear_schiltron } # has_cultural_parameter = unlock_schiltron_innovation + +{% endif %} + diff --git a/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.txt b/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.txt deleted file mode 100644 index 056f9b6b3..000000000 --- a/ImperatorToCK3/Data_Files/configurables/inventions_to_innovations_map.txt +++ /dev/null @@ -1,214 +0,0 @@ -### INVENTIONS TO INNOVATIONS MAPPINGS ### - -# bonus = { ir = imperator invention ck3 = ck3 innovation } -# Multiple Inventions can be listed, if they conceptually contribute to the Innovation -# Working assumption: each bonus line should have no more than 3 universal and 1 cultural/regional Invention per Innovation, on the assumption that each Invention might give a 25% bonus towards the Innovation. -# link = { ir = imperator invention ck3 = ck3 innovation } -# Links are one to one. -# Working assumption: only include an Invention here if it's conceptually almost or actually identical to the Innovation (effects don't matter). -# All CK3 Innovations up to 1.12 are listed here, even if they don't make sense for conversion. -# Lines that don't have any suitable Invention should be commented out - -# TRIBAL ERA - MILITARY -bonus = { ir = fort_maintenance_cost_inv ir = global_defensive_inv_3 ir = global_defensive_inv_1 ck3 = innovation_motte } -link = { ir = siege_speed_inv_3 ck3 = innovation_motte } -bonus = { ir = siege_speed_inv_5 ir = siege_engineers_inv_5 ck3 = innovation_catapult } -link = { ir = siege_engineers_inv_4 ck3 = innovation_catapult } -bonus = { ir = global_start_experience_inv_3 ir = global_start_experience_inv_2 ck3 = innovation_barracks } -link = { ir = cohort_reinforcement_speed_inv ck3 = innovation_barracks } -bonus = { ir = global_start_experience_inv_1 ir = global_supply_limit_modifier_inv_1 ir = heavy_infantry_discipline_inv ck3 = innovation_mustering_grounds } -link = { ir = global_cohort_recruit_speed_inv ck3 = innovation_mustering_grounds } -bonus = { ir = experience_decay_inv_1 ir = general_loyalty_inv ir= tyranny_inv_2 ck3 = innovation_bannus } # 3rd Hierarchy of Responsibility -# link = { ir = ck3 = innovation_bannus } -bonus = { ir = gallic_chainmail_inv ck3 = innovation_quilted_armor } -# link = { ir = ck3 = innovation_quilted_armor } -# TRIBAL ERA - CIVIC -bonus = { ir = global_citizen_output_inv_3 ir = global_freemen_output_inv_3 ir = italic_lex_frumentaria_inv ir = global_tax_modifier_inv_3 ck3 = innovation_development_01 } -link = { ir = ruler_popularity_gain_inv_4 ck3 = innovation_development_01 } # Public Works -bonus = { ir = commerce_inv_1 ir = global_tax_modifier_inv_1 ir = commerce_inv_2 ck3 = innovation_currency_01 } -# link = { ir = ck3 = innovation_currency_01 } -# bonus = { ir = ck3 = innovation_gavelkind } -link = { ir = oaths_of_allegiance_inv ck3 =innovation_gavelkind } # IR is Codified Succession -# bonus = { ir = ck3 = innovation_crop_rotation } -# link = { ir = ck3 = innovation_crop_rotation } -bonus = { ir = italic_insulae_inv ir = italic_lex_frumentaria_inv ck3 = innovation_city_planning } -link = { ir = global_building_slot_inv ck3 = innovation_city_planning } -bonus = { ir = fabricate_claim_cost_modifier_inv ir = agressive_expansion_impact_inv_3 ir = tribute_income_modifier_inv_1 ck3 = innovation_casus_belli } # Third is Tributary Administration -link = { ir = war_score_cost_inv_1 ck3 = innovation_casus_belli } -bonus = { ir = italic_lex_frumentaria_inv ir = global_tribesmen_output_inv_2 ir = global_tribesmen_output_inv_2 ir = global_unrest_inv_5 ck3 = innovation_plenary_assemblies } # 3rd Assemblies -# link = { ir = ck3 = innovation_plenary_assemblies } -bonus = { ir = commerce_inv_5 ir = monthly_wage_inv ir = tribute_income_modifier_inv_3 ck3 = innovation_ledger } -# link = { ir = ck3 = innovation_ledger } -# TRIBAL ERA - REGIONAL -# bonus = { ir = ck3 = innovation_table_of_princes } -# link = { ir = ck3 = innovation_table_of_princes } # culture:czech|slovien -bonus = { ir = blockade_efficiency_inv ir = liburnian_invention_1 ck3 = innovation_longboats } # 1st Experienced Seafarers 2nd Lemboi Scouts (could both fight and row) -# link = { ir = ck3 = innovation_longboats } # region = world_europe_north -# bonus = { ir = ck3 = innovation_elephantry } -# link = { ir = ck3 = innovation_elephantry } # region = world_innovation_elephants -# bonus = { ir = ck3 = innovation_war_camels } -# link = { ir = ck3 = innovation_war_camels } # region = world_innovation_camels -bonus = { ir = buy_military_tradition_inv ck3 = innovation_wootz_steel } -link = { ir = indian_wootz_steel_inv ck3 = innovation_wootz_steel } # world_india_deccan -# bonus = { ir = ck3 = innovation_african_canoes } -# link = { ir = ck3 = innovation_african_canoes } # world_africa_west -# TRIBAL ERA - MEN-AT-ARMS -# bonus = { ir = ck3 = innovation_caballeros } -# link = { ir = ck3 = innovation_caballeros } # region = world_europe_west_iberia -# bonus = { ir = ck3 = innovation_bamboo_bows } -# link = { ir = ck3 = innovation_bamboo_bows } # region = world_india -# bonus = { ir = ck3 = innovation_sahel_horsemen } -# link = { ir = ck3 = innovation_sahel_horsemen } # region = custom_sahel_proper -# bonus = { ir = ck3 = innovation_repeating_crossbow } -# link = { ir = ck3 = innovation_repeating_crossbow } # has_cultural_pillar = heritage_chinese -# bonus = { ir = ck3 = innovation_pole_vault } -# link = { ir = ck3 = innovation_pole_vault } # culture:guanches OR PARENT CULTURE -# TRIBAL ERA - NORTHERN LORDS - has_fp1_dlc_trigger = yes -bonus = { ir = assemble_raiding_inv ck3 = innovation_varangian_adventurers } # 1st Experienced Raiders (Tribal only) -# link = { ir = ck3 = innovation_varangian_adventurers } # ( has_cultural_pillar = heritage_north_germanic OR Norman culture OR Estonian culture ) BUT NOT EARLY MEDIEVAL OR LATER -bonus = { ir = agressive_expansion_monthly_decay_inv_1 ck3 = innovation_all_things } -# link = { ir = ck3 = innovation_all_things } # region = world_europe_north - -# EARLY MEDIEVAL ERA - MILITARY -# bonus = { ir = ck3 = innovation_battlements } -# link = { ir = ck3 = innovation_battlements } -bonus = { ir = siege_speed_inv_1 ck3 = innovation_mangonel } -link = { ir = siege_engineers_inv_6 ck3 = innovation_mangonel } -bonus = { ir = gallic_oppidum_inv ir = siege_speed_inv_4 ir = civic_tech_investment_inv_1 ck3 = innovation_burhs } -# link = { ir = ck3 = innovation_burhs } -bonus = { ir = global_start_experience_inv_4 ck3 = innovation_house_soldiers } -# link = { ir = ck3 = innovation_house_soldiers } -# bonus = { ir = ck3 = innovation_horseshoes } -# link = { ir = ck3 = innovation_horseshoes } -bonus = { ir = gallic_four_horned_saddle_inv ir = heavy_cavalry_discipline_inv ck3 = innovation_arched_saddle } -# link = { ir = ck3 = innovation_arched_saddle } -# EARLY MEDIEVAL ERA - CIVIC -bonus = { ir = monthly_character_loyalty_inv_2 ir = dictatorship_step_3 ir = dictatorship_step_4 ck3 = innovation_hereditary_rule } # 1st Approved Familia 2nd and 3rd are Demand/Request a Line of Succession which are alternatives for Dictatorship -# link = { ir = ck3 = innovation_hereditary_rule } # UNLOCKS PARTITION -bonus = { ir = global_goods_from_slaves_inv ck3 = innovation_manorialism } -link = { ir = global_settlement_building_slot_inv ck3 = innovation_manorialism } -bonus = { ir = smear_character_cost_modifier_inv ck3 = innovation_development_02 } # 1st Town Criers -# link = { ir = ck3 = innovation_development_02 } # Communal Government -bonus = { ir = hold_triumph_cost_modifier_inv ck3 = innovation_currency_02 } -link = { ir = coins_inv ck3 = innovation_currency_02 } # Coinage -link = { ir = brass_coinage_inv ck3 = innovation_currency_02 } # Coinage -bonus = { ir = loyalty_gain_chance_modifier_inv ir = agressive_expansion_monthly_decay_inv_4 ck3 = innovation_royal_prerogative } -# link = { ir = ck3 = innovation_royal_prerogative } -bonus = { ir = land_won_by_the_spear ir = religious_tech_investment_inv_1 ck3 = innovation_chronicle_writing } # 2nd Recording Tradition -# link = { ir = ck3 = innovation_chronicle_writing } -bonus = { ir = indian_trigonometric_functions_inv ck3 = innovation_armilary_sphere } -# link = { ir = ck3 = innovation_armilary_sphere } -bonus = { ir = tyranny_inv_1 ir = religious_tech_investment_inv_2 ck3 = innovation_baliffs } # 1st Official Orators 2nd Scribae -# link = { ir = ck3 = innovation_baliffs } # (sic) bailiffs -# EARLY MEDIEVAL ERA - REGIONAL -# bonus = { ir = ck3 = innovation_reconquista } -# link = { ir = ck3 = innovation_reconquista } # region = world_europe_west_iberia -# bonus = { ir = ck3 = innovation_stem_duchies } -# link = { ir = ck3 = innovation_stem_duchies } # region = custom_europe_western_germany -# bonus = { ir = ck3 = innovation_ghilman } -# link = { ir = ck3 = innovation_ghilman } # region = world_middle_east_arabia -# link = { ir = ck3 = fp3_innovation_mural_sextant } REQUIRES DLC AND COURT SCHOLAR - - -# HIGH MEDIEVAL ERA - MILITARY -# bonus = { ir = ck3 = innovation_hoardings } -# link = { ir = ck3 = innovation_hoardings } -# bonus = { ir = ck3 = innovation_trebuchet } -# link = { ir = ck3 = innovation_trebuchet } -# bonus = { ir = ck3 = innovation_castle_baileys } -# link = { ir = ck3 = innovation_castle_baileys } -# bonus = { ir = ck3 = innovation_men_at_arms } -# link = { ir = ck3 = innovation_men_at_arms } -# bonus = { ir = ck3 = innovation_knighthood } -# link = { ir = ck3 = innovation_knighthood } -# bonus = { ir = ck3 = innovation_advanced_bowmaking } -# link = { ir = ck3 = innovation_advanced_bowmaking } -# HIGH MEDIEVAL ERA - CIVIC -# bonus = { ir = ck3 = innovation_heraldry } -# link = { ir = ck3 = innovation_heraldry } -# bonus = { ir = ck3 = innovation_windmills } -# link = { ir = ck3 = innovation_windmills } -bonus = { ir = agressive_expansion_impact_inv_5 ck3 = innovation_divine_right } # 1st Divine Mandate -# link = { ir = ck3 = innovation_divine_right } -# bonus = { ir = ck3 = innovation_land_grants } -# link = { ir = ck3 = innovation_land_grants } -# bonus = { ir = ck3 = innovation_scutage } -# link = { ir = ck3 = innovation_scutage } -# bonus = { ir = ck3 = innovation_guilds } -# link = { ir = ck3 = innovation_guilds } -# bonus = { ir = ck3 = innovation_development_03 } -# link = { ir = ck3 = innovation_development_03 } # Urbanization -# bonus = { ir = ck3 = innovation_currency_03 } -# link = { ir = ck3 = innovation_currency_03 } # Banking -# HIGH MEDIEVAL ERA - REGIONAL -# bonus = { ir = ck3 = innovation_east_settling } -# link = { ir = ck3 = innovation_east_settling } # region = custom_europe_eastern_germany -# bonus = { ir = ck3 = innovation_seigneurialism } -# link = { ir = ck3 = innovation_seigneurialism } # region = world_europe_west_francia -# bonus = { ir = ck3 = innovation_muladi } -# link = { ir = ck3 = innovation_muladi } # region = world_africa_north -bonus = { ir = subject_opinions_inv_3 ck3 = innovation_french_peerage } -# link = { ir = ck3 = innovation_french_peerage } # region = world_europe_west_francia AND UNLOCKED BY DECISION -# bonus = { ir = ck3 = innovation_sanitation } -# link = { ir = ck3 = innovation_sanitation } # has_cultural_pillar = heritage_byzantine OR has_cultural_pillar = heritage_arabic IN LEGENDS OF THE DEAD FILE BUT NOT ACTUALLY DLC-LOCKED?? -# HIGH MEDIEVAL ERA - MEN-AT-ARMS -# bonus = { ir = ck3 = innovation_desert_tactics } -# link = { ir = ck3 = innovation_desert_tactics } # has_innovation = innovation_desert_tactics CIRCULAR POTENTIAL -# bonus = { ir = ck3 = innovation_hobbies } -# link = { ir = ck3 = innovation_hobbies } # region = ghw_region_britannia -# bonus = { ir = ck3 = innovation_sarawit } -# link = { ir = ck3 = innovation_sarawit } # has_cultural_parameter = unlock_sarawit_innovation - -# LATE MEDIEVAL ERA - MILITARY -# bonus = { ir = ck3 = innovation_machicolations } -# link = { ir = ck3 = innovation_machicolations } -# bonus = { ir = ck3 = innovation_bombard } -# link = { ir = ck3 = innovation_bombard } -# bonus = { ir = ck3 = innovation_royal_armory } -# link = { ir = ck3 = innovation_royal_armory } -# bonus = { ir = ck3 = innovation_standing_armies } -# link = { ir = ck3 = innovation_standing_armies } -# bonus = { ir = ck3 = innovation_sappers } -# link = { ir = ck3 = innovation_sappers } -# bonus = { ir = ck3 = innovation_plate_armor } -# link = { ir = ck3 = innovation_plate_armor } -# LATE MEDIEVAL ERA - CIVIC -# bonus = { ir = ck3 = innovation_primogeniture } -# link = { ir = ck3 = innovation_primogeniture } -bonus = { ir = global_defensive_inv_5 ck3 = innovation_cranes } -# link = { ir = ck3 = innovation_cranes } -# bonus = { ir = ck3 = innovation_noblesse_oblige } -# link = { ir = ck3 = innovation_noblesse_oblige } -# bonus = { ir = ck3 = innovation_rightful_ownership } -# link = { ir = ck3 = innovation_rightful_ownership } -# bonus = { ir = ck3 = innovation_ermine_cloaks } -# link = { ir = ck3 = innovation_ermine_cloaks } -# bonus = { ir = ck3 = innovation_court_officials } -# link = { ir = ck3 = innovation_court_officials } -# bonus = { ir = ck3 = innovation_development_04 } -# link = { ir = ck3 = innovation_development_04 } # Renaissance Thought -# bonus = { ir = ck3 = innovation_currency_04 } -# link = { ir = ck3 = innovation_currency_04 } # Promissory Notes -# LATE MEDIEVAL ERA - REGIONAL -# bonus = { ir = ck3 = innovation_wierdijks } -# link = { ir = ck3 = innovation_wierdijks } # region = custom_netherlands -# bonus = { ir = ck3 = innovation_condottieri } -# link = { ir = ck3 = innovation_condottieri } # region = world_europe_south_italy -# bonus = { ir = ck3 = innovation_deccan_unity } -# link = { ir = ck3 = innovation_deccan_unity } # region = world_india_deccan -# LATE MEDIEVAL ERA - REGIONAL -bonus = { ir = indian_tube_drawn_technology_inv ir = global_citizen_happyness_inv ck3 = fp3_innovation_fritware } # 2nd Glass Blowing -# link = { ir = ck3 = fp3_innovation_fritware } REQUIRES DLC AND COURT SCHOLAR -# LATE MEDIEVAL ERA - MEN-AT-ARMS -# bonus = { ir = ck3 = innovation_zweihanders } -# link = { ir = ck3 = innovation_zweihanders } # region = ghw_region_germany && has_cultural_pillar = heritage_central_germanic -# bonus = { ir = ck3 = innovation_adaptive_militia } -# link = { ir = ck3 = innovation_adaptive_militia } # has_cultural_parameter = unlock_adaptive_militia_innovation -# bonus = { ir = ck3 = innovation_valets } -# link = { ir = ck3 = innovation_valets } # has_cultural_parameter = unlock_valets_innovation -# bonus = { ir = ck3 = innovation_pike_columns } -# link = { ir = ck3 = innovation_pike_columns } # has_cultural_parameter = unlock_innovation_pike_columns -bonus = { ir = discipline_inv_5 ir = discipline_inv_2 ir = military_tech_investment_inv_2 ck3 = innovation_legionnaires } # 1st Cohorts 2nd Manipular Legion 3rd Praefactus Fabrum -# link = { ir = ck3 = innovation_legionnaires } # culture:roman -# bonus = { ir = ck3 = innovation_rectilinear_schiltron } -# link = { ir = ck3 = innovation_rectilinear_schiltron } # has_cultural_parameter = unlock_schiltron_innovation diff --git a/ImperatorToCK3/Mappers/Technology/InnovationMapper.cs b/ImperatorToCK3/Mappers/Technology/InnovationMapper.cs index cffff186f..90660474f 100644 --- a/ImperatorToCK3/Mappers/Technology/InnovationMapper.cs +++ b/ImperatorToCK3/Mappers/Technology/InnovationMapper.cs @@ -1,7 +1,9 @@ using commonItems; using commonItems.Localization; +using DotLiquid; using ImperatorToCK3.Imperator.Inventions; using System.Collections.Generic; +using System.IO; using System.Linq; namespace ImperatorToCK3.Mappers.Technology; @@ -10,12 +12,20 @@ internal sealed class InnovationMapper { private readonly List innovationLinks = []; private readonly List innovationBonuses = []; - public void LoadLinksAndBonuses(string configurablePath) { + public void LoadLinksAndBonuses(string configurablePath, OrderedDictionary ck3ModFlags) { + // The file used the Liquid templating language, so convert it to text before parsing. + var convertedModFlags = ck3ModFlags.ToDictionary(kv => kv.Key, kv => (object)kv.Value); + var context = Hash.FromDictionary(convertedModFlags); + + var liquidText = File.ReadAllText(configurablePath); + var template = Template.Parse(liquidText); + var result = template.Render(context); + var parser = new Parser(); parser.RegisterKeyword("link", reader => innovationLinks.Add(new InnovationLink(reader))); parser.RegisterKeyword("bonus", reader => innovationBonuses.Add(new InnovationBonus(reader))); parser.IgnoreAndLogUnregisteredItems(); - parser.ParseFile(configurablePath); + parser.ParseStream(new BufferedReader(result)); } public List GetInnovations(IEnumerable irInventions) { From f98b55c434c6e774bb9ce470b84d5143ff5f88d5 Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 15:38:21 +0100 Subject: [PATCH 06/13] Add mapping to TFE Iranian Mithraism --- .../Data_Files/configurables/culture_map.txt | 5 ++++- .../Data_Files/configurables/religion_map.txt | 14 ++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ImperatorToCK3/Data_Files/configurables/culture_map.txt b/ImperatorToCK3/Data_Files/configurables/culture_map.txt index 36da8da65..023572c93 100644 --- a/ImperatorToCK3/Data_Files/configurables/culture_map.txt +++ b/ImperatorToCK3/Data_Files/configurables/culture_map.txt @@ -582,6 +582,9 @@ link = { ck3=butr ir=gyzantian ir=psyllic ir=nasamonian ir=perorsian ir=phazani link = { ck3=numidian ir=capariensian ir=lotophagoi ir=abannaean } ## Persian and Iranian +# TFE +link = { ck3 = median ir = median } +# vanilla CK3 link = { ck3 = persian ir = persian } # https://steamcommunity.com/sharedfiles/filedetails/?id=3098496649 link = { ck3 = daylamite ir = daylamite } # https://steamcommunity.com/sharedfiles/filedetails/?id=3098496649 link = { ck3 = baloch ir = baloch } # https://steamcommunity.com/sharedfiles/filedetails/?id=3098496649 @@ -591,7 +594,7 @@ link = { ck3 = daylamite ir = hyrcanian } link = { ck3 = parthian ir = parthian } link = { ck3 = kurdish - ir = median + ir = median # TODO: add a separate Median culture to the converter instead of mapping to Kurdish ir = cardukoi # added by Invictus https://en.wikipedia.org/wiki/Carduchii, TODO: create a separate CK3 culture for them } link = { ck3 = afghan ir = pactyan ir = sattagydian } diff --git a/ImperatorToCK3/Data_Files/configurables/religion_map.txt b/ImperatorToCK3/Data_Files/configurables/religion_map.txt index c788ae4ea..4d1181c1b 100644 --- a/ImperatorToCK3/Data_Files/configurables/religion_map.txt +++ b/ImperatorToCK3/Data_Files/configurables/religion_map.txt @@ -59,6 +59,16 @@ link = { ck3=pagan ir=nuragic_pantheon } # TODO: https://github.com/ParadoxGameC link = { ck3 = pagan ir = pagan } link = { ck3 = kushitism_pagan ir = kushite } +# Iranian Mithraism (mithra_religion in Invictus) +# https://en.wikipedia.org/wiki/Mithra +# TFE +link = { ck3 = kitebacilweism ir = mithra_religion } +# vanilla CK3 +link = { # TODO: Change this mapping for non-TFE conversions. The Zoroastrian cult of Mithra is not the same as the Roman Mithraic Mysteries. + ck3 = mithraic_mysteries + ir = mithra_religion +} + # Arabic link = { ck3 = aksumite_pagan ir = arabian_pantheon irRegion = punt_region } # TFE link = { # TFE @@ -75,10 +85,6 @@ link = { ck3 = arabic_pagan ir = arabian_pantheon } # Hellenic - TFE link = { ck3 = roman_pagan ir = italic_pantheon } # Hellenic - Vanilla CK3 -link = { # TODO: Change this mapping. The Zoroastrian cult of Mithra is not the same as the Roman Mithraic Mysteries. - ck3 = mithraic_mysteries - ir = mithra_religion # from Invictus -} link = { ck3 = eleusinian_mysteries ir = roman_pantheon irRegion = thrace_region } # https://en.wikipedia.org/wiki/Eleusinian_Mysteries link = { ck3 = celto_hellenic_syncretism From 5c72b36d0936122d0027fb5559d21c2033f5f4a0 Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 18:00:45 +0100 Subject: [PATCH 07/13] Remove contents of TFE 50_beards_scripted_characters.txt from generated mod --- .../removable_file_blocks_tfe.txt | 1254 +++++++++++++++++ 1 file changed, 1254 insertions(+) diff --git a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt index 65e88949c..fc1733922 100644 --- a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt +++ b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt @@ -2949,3 +2949,1257 @@ dong_zhuo_culture_decision = { } } } + +"gfx/portraits/portrait_modifiers/50_beards_scripted_characters.txt" = { + { +# We can use these modifiers for adding specific beards and beards to historical and vanity characters + +beards_scripted_characters = { + + usage = game + selection_behavior = max + + male_beard_western_01 = { # Standard full beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.04 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:144998 #king_lothaire + this = character:144998 #king_lothaire + } + modifier = { + add = 999 + exists = this + exists = character:83355 #petty_king_murchad + this = character:83355 #petty_king_murchad + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_petter_vilberg + this = character:easteregg_petter_vilberg + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_james_beaumont + this = character:easteregg_james_beaumont + } + modifier = { + add = 999 + exists = this + exists = character:159038 #Coel + this = character:159038 #ACoel + } + modifier = { + add = 999 + exists = this + exists = character:900062 #Stilicho + this = character:900062 #Stilicho + } + modifier = { + add = 999 + exists = this + exists = character:180618 #Bahram + this = character:180618 #Bahram + } + modifier = { + add = 999 + exists = this + exists = character:83432 #Eochaid + this = character:83432 #Eochaid + } + modifier = { + add = 999 + exists = this + exists = character:londinium_01 #Riothamus + this = character:londinium_01 #Riothamus + } + modifier = { + add = 999 + exists = this + exists = character:vigg_04 #Hengest + this = character:vigg_04 #Hengest + } + modifier = { + add = 999 + exists = this + exists = character:constantinus_05 #Ambrosius + this = character:constantinus_05 #Ambrosius + } + modifier = { + add = 999 + exists = this + exists = character:cappadocia_07 #Ioannes + this = character:cappadocia_07 #Ioannes + } + modifier = { + add = 999 + exists = this + exists = character:mauri_42 #Iabdas + this = character:mauri_42 #Iabdas + } + modifier = { + add = 999 + exists = this + exists = character:997011 #Chlodomir + this = character:997011 #Chlodomir + } + } + } + + male_beard_western_02 = { # Standard goatee + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.07 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:107500 #king_sancho + this = character:107500 #king_sancho + } + modifier = { + add = 999 + exists = this + exists = character:42018 #karlmann + this = character:42018 #karlmann + } + modifier = { + add = 999 + exists = this + exists = character:991004 #Mundus + this = character:991004 #Mundus + } + } + } + + male_beard_western_03 = { # Short beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.11 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:163110 #sigurdr_snake_in_the_eye + this = character:163110 #sigurdr_snake_in_the_eye + } + modifier = { + add = 999 + exists = this + exists = character:90104 #charles_the_bald + this = character:90104 #charles_the_bald + } + modifier = { + add = 999 + exists = this + exists = character:109500 #king_garcia + this = character:109500 #king_garcia + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_henrik_fahraeus + this = character:easteregg_henrik_fahraeus + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_olof_bjork + this = character:easteregg_olof_bjork + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_sean_hughes + this = character:easteregg_sean_hughes + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_maximilian_olbers + this = character:easteregg_maximilian_olbers + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_nikolaos_kaltsogiannis + this = character:easteregg_nikolaos_kaltsogiannis + } + } + } + + male_beard_western_04 = { # Short goatee + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.14 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:easteregg_nils_wadensten + this = character:easteregg_nils_wadensten + } + modifier = { + add = 999 + exists = this + exists = character:waegmunding_2 #Beowulf + this = character:waegmunding_2 #Beowulf + } + } + } + + male_beard_western_05 = { # Mustache + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.17 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:122 #king_harold + this = character:122 #king_harold + } + modifier = { + add = 999 + exists = this + exists = character:1128 #duke_robert + this = character:1128 #duke_robert + } + modifier = { + add = 999 + exists = this + exists = character:992016 #theodoric_the_great + this = character:992016 #theodoric_the_great + } + modifier = { + add = 999 + exists = this + exists = character:992022 #Theodahad + this = character:992022 #Theodahad + } + modifier = { + add = 999 + exists = this + exists = character:997003 #Merovech + this = character:997003 #Merovech + } + } + } + + male_beard_western_06 = { # Big bushy beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.2 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:106000 #king_antso + this = character:106000 #king_antso + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_paul_depre + this = character:easteregg_paul_depre + } + modifier = { + add = 999 + exists = this + exists = character:999103 #Alaric I + this = character:999103 #Alaric I + } + modifier = { + add = 999 + exists = this + exists = character:997002 #Chlodio + this = character:997002 #Chlodio + } + } + } + + male_beard_western_07 = { # Chin strap + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.23 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:997004 #Childeric + this = character:997004 #Childeric + } + } + } + + male_beard_western_08 = { # Big with fancy mustache + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.27 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:984 #king_malcom + this = character:984 #king_malcom + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_max_weltz + this = character:easteregg_max_weltz + } + modifier = { + add = 999 + exists = this + exists = character:arsacid_58 #vramshapuh + this = character:arsacid_58 #vramshapuh + } + modifier = { + add = 999 + exists = this + exists = character:145071 #Heraclius + this = character:145071 #Heraclius + } + } + } + + male_beard_western_09 = { # Pointy beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.30 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:159431 #Conan Meriadoc + this = character:159431 #Conan Meriadoc + } + modifier = { + add = 999 + exists = this + exists = character:maldras_06 #Hermenerich + this = character:maldras_06 #Hermenerich + } + modifier = { + add = 999 + exists = this + exists = character:997009 #Theodoric Meroving + this = character:997009 #Theodoric Meroving + } + modifier = { + add = 999 + exists = this + exists = character:992063 #Fritigern + this = character:992063 #Fritigern + } + } + } + + male_beard_western_10 = { # Chin goatee + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.33 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_mena_01 = { # Very curly medium length full beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.35 # For the randomness to work correctly + } + } + weight = { + base = 0 + + modifier = { + add = 999 + exists = this + exists = character:982001 #Abu Karib + this = character:982001 #Abu Karib + } + } + } + + male_beard_mena_02 = { # Big with small mustache + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.39 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:3924 #emir_yahya + this = character:3924 #emir_yahya + } + modifier = { + add = 999 + exists = this + exists = character:lakhmid_06 #al-Nu'Man + this = character:lakhmid_06 #al-Nu'Man + } + modifier = { + add = 999 + exists = this + exists = character:rugian_03 #Feletheus + this = character:rugian_03 #Feletheus + } + } + } + + male_beard_mena_03 = { # Big chin strap + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.42 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_mena_04 = { # Short stylish + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.45 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:quadi_04 # Hermerich of the Quadi + this = character:quadi_04 # Hermerich of the Quadi + } + modifier = { + add = 999 + exists = this + exists = character:syagri_06 #Syagrus + this = character:syagri_06 #Syagrus + } + modifier = { + add = 999 + exists = this + exists = character:997005 #Chlodovech + this = character:997005 #Chlodovech + } + modifier = { + add = 999 + exists = this + exists = character:belisarius_001 #Belisarius + this = character:belisarius_001 #Belisarius + } + } + } + + male_beard_northern_01 = { # Big wide + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.48 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:163111 #ivar_the_boneless + this = character:163111 #ivar_the_boneless + } + modifier = { + add = 999 + exists = this + exists = character:102531 #harald_hardrade + this = character:102531 #harald_hardrade + } + } + } + + male_beard_northern_02 = { # Single braid + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.52 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:163112 #halfdan_whiteshirt + this = character:163112 #halfdan_whiteshirt + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:6878 #jarl_haesteinn + this = character:6878 #jarl_haesteinn + } + } + } + + male_beard_northern_03 = { # Beaded beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.54 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:163108 #bjorn_ironside + this = character:163108 #bjorn_ironside + } + modifier = { + add = 999 + exists = this + exists = character:40605 #rurik + this = character:40605 #rurik + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_peter_johannesson + this = character:easteregg_peter_johannesson + } + modifier = { + add = 999 + exists = character:997013 #Chlothar + this = character:997013 #Chlothar + } + } + } + + male_beard_steppe_01 = { # long at chin with mustache + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.58 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = character:ashina_03 #Tuwu + this = character:ashina_03 #Tuwu + } + modifier = { + add = 999 + exists = character:ashina_04 #Bumin + this = character:ashina_04 #Bumin + } + } + } + + male_beard_steppe_02 = { # low rough + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.61 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:159137 #almos_arpad + this = character:159137 #almos_arpad + } + modifier = { + add = 999 + exists = character:990006 #Attila + this = character:990006 #Attila + } + modifier = { + add = 999 + exists = character:ashina_05 #Istemi + this = character:ashina_05 #Istemi + } + modifier = { + add = 999 + exists = this + exists = character:hephthalite_misc_017 #Katulf + this = character:hephthalite_misc_017 #Katulf + } + } + } + + male_beard_sub_saharan_01 = { # Full african beard medium + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.64 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:nuvelan_11 #Gildo + this = character:nuvelan_11 #Gildo + } + modifier = { + add = 999 + exists = this + exists = character:aksum_16 #Ouazeba + this = character:aksum_16 #Ouazeba + } + modifier = { + add = 999 + exists = this + exists = character:himyarite_30 #Abraha + this = character:himyarite_30 #Abraha + } + } + } + + male_beard_sub_saharan_02 = { # Stylish african goatee + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.67 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:aksum_17 #eon + this = character:aksum_17 #eon + } + } + } + + male_beard_sub_saharan_03 = { # Full african beard long + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.70 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_indian_01 = { # Handlebar mustache + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.74 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:easteregg_struan_mccallum + this = character:easteregg_struan_mccallum + } + modifier = { + add = 999 + exists = this + exists = character:alchonid_005 #Khingila + this = character:alchonid_005 #Khingila + } + modifier = { + add = 999 + exists = this + exists = character:arsacid_64 #Mystakon + this = character:arsacid_64 #Mystakon + } + } + } + + male_beard_indian_02 = { # Indian pointy + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.77 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:900016 #Faramund + this = character:900016 #Faramund + } + modifier = { + add = 999 + exists = this + exists = character:xionite_001 #Kidara + this = character:xionite_001 #Kidara + } + modifier = { + add = 999 + exists = this + exists = character:145072 #Focas + this = character:145072 #Focas + } + modifier = { + add = 999 + exists = this + exists = character:greek_17 #Plutarch + this = character:greek_17 #Plutarch + } + } + } + + male_beard_indian_03 = { # Very curly medium length full beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.80 # For the randomness to work correctly + } + } + weight = { + base = 0 + + } + } + + male_beard_rtt_01 = { # Wizard beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.0 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + ### FP2 Beards ### + + male_beard_fp2_iberian_christian_01 = { # Twin braids with metal rings + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.11 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_fp2_iberian_christian_02 = { # Twin braids with metal rings + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.235 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:996002 #Odovacar + this = character:996002 #Odovacar + } + modifier = { + add = 999 + exists = this + exists = character:168137 + this = character:168137 + } + + modifier = { + add = 999 + exists = this + exists = character:70292 + this = character:70292 + } + } + } + + male_beard_fp2_iberian_christian_03 = { # Twin braids with metal rings + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.36 # For the randomness to work correctly + } + } + weight = { + base = 0 + + modifier = { + add = 999 + exists = this + exists = character:73813 + this = character:73813 + } + + modifier = { + add = 999 + exists = this + exists = character:surunbaqi0001 + this = character:surunbaqi0001 + } + } + } + + male_beard_fp2_iberian_christian_04 = { + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.485 # For the randomness to work correctly + } + } + weight = { + base = 0 + + modifier = { + add = 999 + exists = this + exists = character:barcelona_00003 + this = character:barcelona_00003 + } + modifier = { + add = 999 + exists = this + exists = character:200280 #Theodis + this = character:200280 #Theodis + } + modifier = { + add = 999 + exists = this + exists = character:997015 #Theodobert + this = character:997015 #Theodobert + } + } + } + + male_beard_fp2_iberian_muslim_01 = { # Thick Groomed Beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.61 # For the randomness to work correctly + } + } + weight = { + base = 0 + + modifier = { + add = 999 + exists = this + exists = character:70150 + this = character:70150 + } + + modifier = { + add = 999 + exists = this + exists = character:180628 #Khosrau + this = character:180628 #Khosrau + } + + modifier = { + add = 999 + exists = this + exists = character:73683 + this = character:73683 + } + modifier = { + add = 999 + exists = this + exists = character:200284 #euric + this = character:200284 #euric + } + modifier = { + add = 999 + exists = this + exists = character:aelling_01 #Aelle + this = character:aelling_01 #Aelle + } + modifier = { + add = 999 + exists = this + exists = character:159012 #Cadwallon + this = character:159012 #Cadwallon + } + } + } + + male_beard_fp2_iberian_muslim_02 = { # Scholar's beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.735 # For the randomness to work correctly + } + } + weight = { + base = 0 + + modifier = { + add = 999 + exists = this + exists = character:danis0005 + this = character:danis0005 + } + modifier = { + add = 999 + exists = this + exists = character:vandals_003 + this = character:vandals_003 + } + modifier = { + add = 999 + exists = this + exists = character:145237 #julian_the_apostate + this = character:145237 #julian_the_apostate + } + modifier = { + add = 999 + exists = this + exists = character:greek_20 #Proklos + this = character:greek_20 #Proklos + } + } + } + + + + male_beard_fp2_iberian_muslim_03 = { # Forked beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 0.860 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:mauri_36 #Masties + this = character:mauri_36 #Masties + } + } + } + + no_beard = { + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_02 + value = 1 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:73857 + this = character:73857 + } + modifier = { + add = 999 + exists = this + exists = character:nepos_02 #Nepos + this = character:nepos_02 #Nepos + } + modifier = { + add = 999 + exists = this + exists = character:70512 #Justinian + this = character:70512 #Justinian + } + modifier = { + add = 999 + exists = this + exists = character:205141 #Ceredig + this = character:205141 #Ceredig + } + modifier = { + add = 999 + exists = this + exists = character:vandals_005 #Hilderic + this = character:vandals_005 #Hilderic + } + modifier = { + add = 999 + exists = this + exists = character:vandals_012 #Gelimer + this = character:vandals_012 #Gelimer + } + modifier = { + add = 999 + exists = this + exists = character:992023 #Athalaric + this = character:992023 #Athalaric + } + modifier = { + add = 999 + exists = this + exists = character:70515 #Zeno + this = character:70515 #Zeno + } + modifier = { + add = 999 + exists = this + exists = character:70517 #Leo + this = character:70517 #Leo + } + modifier = { + add = 999 + exists = this + exists = character:70514 #Anastasius + this = character:70514 #Anastasius + } + modifier = { + add = 999 + exists = this + exists = character:armenian_01 #Narses + this = character:armenian_01 #Narses + } + modifier = { + add = 999 + exists = this + exists = character:mauro_roman_kings_02 #Massonas + this = character:mauro_roman_kings_02 #Massonas + } + modifier = { + add = 999 + exists = this + exists = character:samo_01 #Samo + this = character:samo_01 #Samo + } + } + } + + + ### FP1 Beards ### + male_beard_fp1_01 = { # Twin braids with metal rings + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.84 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_fp1_02 = { # Short low beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.1 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:159117 #Kubrat + this = character:159117 #Kubrat + } + } + } + + male_beard_fp1_03 = { # Wavy pointy beard + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.90 # For the randomness to work correctly + } + } + weight = { + base = 0 + + } + } + + male_beard_fp1_04 = { # Huge braid + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.94 # For the randomness to work correctly + } + } + weight = { + base = 0 + } + } + + male_beard_fp1_05 = { # Long narrow wavy + dna_modifiers = { + accessory = { + mode = add + gene = beards + template = scripted_character_beards_01 + value = 0.97 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:997012 #Childebert + this = character:997012 #Childebert + } + modifier = { + add = 999 + exists = this + exists = character:992003 #Hermanaric + this = character:992003 #Hermanaric + } + } + } +} + } +} \ No newline at end of file From 9e6ed9ff47a08ef8ff913be30d56412c1bd8af63 Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 18:32:37 +0100 Subject: [PATCH 08/13] Remove more parts of TFE from the generated mod --- .../removable_file_blocks_tfe.txt | 1527 ++++++++++++++++- 1 file changed, 1463 insertions(+), 64 deletions(-) diff --git a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt index fc1733922..df2338bf9 100644 --- a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt +++ b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt @@ -2271,6 +2271,33 @@ } } +"common/on_action/east_asia_flavor_on_actions.txt" = { + { +on_game_start = { + on_actions = { + on_TFE_east_asia_start + } +} + +on_TFE_east_asia_start = { + effect = { + character:western_liang_043 ?= { + if = { + limit = { + is_alive = yes + is_landed = yes + } + trigger_event = { + id = liang.0012 + days = { 365 2190 } + } + } + } + } +} + } +} + "common/scripted_triggers/tfe_culture_triggers.txt" = { { dynasty = dynasty:nuvelan @@ -2310,85 +2337,1440 @@ this = character:70515 #Zeno } } - { - modifier = { - add = 999 - exists = this - exists = character:vigg_04 #Hengest - this = character:vigg_04 #Hengest - } + { + modifier = { + add = 999 + exists = this + exists = character:vigg_04 #Hengest + this = character:vigg_04 #Hengest + } + } + { + modifier = { + add = 999 + exists = this + exists = character:syagri_06 #Syagrus + this = character:syagri_06 #Syagrus + } + } + { + modifier = { + add = 999 + exists = this + exists = character:rugian_03 #Feletheus + this = character:rugian_03 #Feletheus + } + } + { + modifier = { + add = 999 + exists = this + exists = character:6878 #jarl_haesteinn + this = character:6878 #jarl_haesteinn + } + } + { + modifier = { + add = 999 + exists = this + exists = character:aelling_01 #Aelle + this = character:aelling_01 #Aelle + } + } + { + modifier = { + add = 999 + exists = this + exists = character:6448 #count_eudes + this = character:6448 #count_eudes + } + } + { + modifier = { + add = 999 + exists = this + exists = character:107500 #king_sancho + this = character:107500 #king_sancho + } + } + { + modifier = { + add = 999 + exists = this + exists = character:214 #king_philippe + this = character:214 #king_philippe + } + } + { + modifier = { + add = 999 + exists = this + exists = character:easteregg_elisabeth_gangenes + this = character:easteregg_elisabeth_gangenes + } + } + { + modifier = { + add = 999 + exists = this + exists = character:7757 #duchess_matilda + this = character:7757 #duchess_matilda + } + modifier = { + add = 999 + exists = this + exists = character:102505 #queen_ingebjorg + this = character:102505 #queen_ingebjorg + } + modifier = { + add = 999 + exists = this + exists = character:765 #princess_swietoslawa + this = character:765 #princess_swietoslawa + } + modifier = { + add = 999 + exists = this + exists = character:930551279 #eudoxia + this = character:930551279 #eudoxia + } + modifier = { + add = 999 + exists = this + exists = character:placidia_01 #placidia + this = character:placidia_01 #placidia + } + modifier = { + add = 999 + exists = this + exists = character:900065 #serena + this = character:900065 #serena + } + modifier = { + add = 999 + exists = this + exists = character:992020 #Amalasuntha + this = character:992020 #Amalasuntha + } + modifier = { + add = 999 + exists = this + exists = character:992024 #Matasuntha + this = character:992024 #Matasuntha + } + } +} + +"common\casus_belli_types\TFE_event_wars.txt" = { + { +independence_war_vandal = { + icon = independence_faction_war + group = event + ai = no # AI targeting is handled through game_rule events. + + allow_hostages = no + allowed_against_character = { + OR = { + scope:attacker = { + liege = scope:defender + } + scope:attacker = { + top_liege = scope:defender + } + } + } + + cost = { + piety = { + value = 0 + } + prestige = { + value = 0 + } + } + + on_declaration = { + on_declared_war = yes + # Remove offending HumSac modifiers. + scope:attacker = { + hidden_effect = { fp1_remove_humsac_offended_counties_effect = yes } + } + war = { + every_war_attacker = { + if = { + limit = { + OR = { + liege = title:k_africae.holder + AND = { + liege = { + liege = scope:defender + } + NOT = { + faith = liege.faith + } + } + } + } + add_character_flag = should_become_independent + } + } + } + } + + on_victory_desc = { + first_valid = { + triggered_desc = { + trigger = { # Desc for only one player attacker + scope:attacker = { + is_local_player = yes + } + } + desc = independence_war_victory_desc_local_player_attacker_alone + } + triggered_desc = { # Desc for only one attacker, player defender + trigger = { + scope:defender = { + is_local_player = yes + } + } + desc = player_independence_war_victory_desc_local_player_defender_attacker_alone + } + desc = independence_war_victory_desc_local_player_attacker_alone # Desc for a third party involved + } + + } + + on_victory = { + scope:attacker = { show_pow_release_message_effect = yes } + + #EP2 Accolade glory gain from winning against higher ranked enemy + scope:attacker = { accolade_attacker_war_end_glory_gain_med_effect = yes } + + create_title_and_vassal_change = { + type = independency + save_scope_as = change + } + if = { + # Free character with the flag + limit = { exists = war } + war = { + every_war_attacker = { + if = { + limit = { has_character_flag = should_become_independent } + + create_title_and_vassal_change = { + type = independency + save_scope_as = going_independent + add_claim_on_loss = no + } + becomes_independent = { + change = scope:going_independent + } + + resolve_title_and_vassal_change = scope:going_independent + + add_truce_both_ways = { + character = scope:defender + days = 1825 + war = root.war + result = victory + } + + remove_character_flag = should_become_independent + + change_liege_or_become_independent = { + CHANGE = scope:change + VASSAL = this + } + + hidden_effect = { + set_variable = { + name = independence_war_former_liege + value = scope:defender + } + + save_scope_as = current_member + + # Struggle Catalyst + if = { + limit = { + catalyst_gave_independence_to_powerful_diff_faith_culture_vassal_preliminary_trigger = { + CHAR1 = scope:defender + CHAR2 = scope:current_member + } + any_character_struggle = { + involvement = involved + activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:current_member + } + } + } + every_character_struggle = { + involvement = involved + limit = { + activate_struggle_catalyst_secondary_character_involvement_either_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:current_member + } + } + activate_struggle_catalyst = { + catalyst = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + character = scope:defender + } + } + } + } + } + } + } + } + + scope:defender = { + # Struggle Catalyst + hidden_effect = { + if = { + limit = { + catalyst_gave_independence_to_powerful_diff_faith_culture_vassal_preliminary_trigger = { + CHAR1 = scope:defender + CHAR2 = scope:attacker + } + any_character_struggle = { + involvement = involved + activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:attacker + } + } + } + every_character_struggle = { + involvement = involved + limit = { + activate_struggle_catalyst_secondary_character_involvement_either_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:attacker + } + } + activate_struggle_catalyst = { + catalyst = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + character = scope:defender + } + } + } + } + } + + resolve_title_and_vassal_change = scope:change + + } + + on_white_peace_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = player_independence_war_white_peace_defender_desc + } + triggered_desc = { + trigger = { + scope:attacker = { + is_local_player = yes + } + } + desc = player_independence_war_white_peace_attacker_desc + } + desc = player_independence_war_white_peace_desc + } + + } + + on_white_peace = { + scope:attacker = { + show_pow_release_message_effect = yes + stress_impact = { + ambitious = medium_stress_impact_gain + arrogant = medium_stress_impact_gain + } + } + hidden_effect = { + scope:attacker = { + add_truce_both_ways = { + character = scope:defender + days = 1825 + war = root.war + result = white_peace + } + } + } + + scope:defender = { + add_prestige = minor_prestige_value + stress_impact = { + arrogant = medium_stress_impact_gain + } + } + } + + on_defeat_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = player_independence_defeat_defender_desc + } + triggered_desc = { + trigger = { + scope:attacker = { + is_local_player = yes + } + } + desc = player_independence_defeat_attacker_desc + } + desc = player_independence_war_defeat_desc + } + + } + + on_defeat = { + scope:attacker = { show_pow_release_message_effect = yes } + scope:defender = { + add_dread = medium_dread_gain + # Prestige for Defender + add_prestige_war_defender_effect = { + PRESTIGE_VALUE = medium_prestige_value + } + } + + if = { + # Free character with the flag + limit = { exists = war } + war = { + every_war_attacker = { + save_scope_as = expelled_vandal + if = { + limit = { + has_character_flag = should_become_independent + NOT = { THIS = character:vandals_012 } + } + hard_imprison_character_effect = { + TARGET = this + IMPRISONER = scope:defender + } + scope:defender = { + add_opinion = { + target = prev + modifier = vassal_lost_faction_revolt_war + } + } + } + if = { + limit = { + THIS = character:vandals_012 + title:c_cappadocia.holder = { + is_ai = yes + } + } + title:c_cappadocia = { + save_temporary_scope_as = current_county + } + create_title_and_vassal_change = { + type = usurped + save_scope_as = change + add_claim_on_loss = no + } + scope:current_county = { + change_title_holder = { + holder = character:vandals_012 + change = scope:change + take_baronies = yes + } + } + resolve_title_and_vassal_change = scope:change + + every_vassal = { + add_to_list = vassals_to_defect + } + + every_held_title = { + limit = { + NOT = { this = title:c_cappadocia } + } + add_to_list = titles_to_usurp + } + + create_title_and_vassal_change = { + type = usurped + save_scope_as = title_change + add_claim_on_loss = no + } + every_in_list = { + list = titles_to_usurp + change_title_holder = { + holder = title:k_africae.holder + change = scope:title_change + take_baronies = no + } + } + every_in_list = { + list = vassals_to_defect + change_liege = { + liege = title:k_africae.holder + change = scope:title_change + } + } + change_liege = { + liege = title:k_africae.holder.top_liege + change = scope:title_change + } + resolve_title_and_vassal_change = scope:title_change + character:vandals_012 = { + add_character_modifier = { + modifier = peaceful_retirement + } + add_trait = content + change_government = imperial_government + } + } + else_if = { + limit = { + THIS = character:vandals_012 + } + title:c_lower_galatia = { + save_temporary_scope_as = current_county + } + create_title_and_vassal_change = { + type = usurped + save_scope_as = change + add_claim_on_loss = no + } + scope:current_county = { + change_title_holder = { + holder = character:vandals_012 + change = scope:change + take_baronies = yes + } + } + resolve_title_and_vassal_change = scope:change + + every_vassal = { + add_to_list = vassals_to_defect + } + + every_held_title = { + limit = { + NOT = { this = title:c_lower_galatia } + } + add_to_list = titles_to_usurp + } + + create_title_and_vassal_change = { + type = usurped + save_scope_as = title_change + add_claim_on_loss = no + } + every_in_list = { + list = titles_to_usurp + change_title_holder = { + holder = title:k_africae.holder + change = scope:title_change + take_baronies = no + } + } + every_in_list = { + list = vassals_to_defect + change_liege = { + liege = title:k_africae.holder + change = scope:title_change + } + } + change_liege = { + liege = title:k_africae.holder.top_liege + change = scope:title_change + } + resolve_title_and_vassal_change = scope:title_change + character:vandals_012 = { + add_character_modifier = { + modifier = peaceful_retirement + } + add_trait = content + change_government = imperial_government + } + } + if = { + limit = { + liege = title:k_africae.holder + NOT = { THIS = character:vandals_012 } + } + save_scope_as = vandal_expel + scope:defender.top_liege = { + random_sub_realm_county = { + limit = { + kingdom = title:k_orientis + holder = { + is_ai = yes + realm_size > 1 + NOT = { + OR = { + THIS = primary_title.title_capital_county + THIS = primary_title.title_capital_county.de_jure_liege + } + } + } + NOT = { + is_in_list = vandal_titles_to_usurp + } + } + save_scope_as = county_expel + add_to_list = vandal_titles_to_usurp + + #create_title_and_vassal_change = { + # type = usurped + # save_scope_as = change + # add_claim_on_loss = no + #} + #scope:county_expel = { + # change_title_holder = { + # holder = scope:expelled_vandal + # change = scope:change + # take_baronies = yes + # } + #} + #resolve_title_and_vassal_change = scope:change + } + scope:vandal_expel = { + every_vassal = { + add_to_list = vassals_to_defect + } + + every_held_title = { + limit = { + NOT = { this = scope:county_expel } + } + add_to_list = titles_to_usurp + } + + create_title_and_vassal_change = { + type = usurped + save_scope_as = title_change + add_claim_on_loss = no + } + every_in_list = { + list = titles_to_usurp + change_title_holder = { + holder = title:k_africae.holder + change = scope:title_change + take_baronies = no + } + } + every_in_list = { + list = vassals_to_defect + change_liege = { + liege = title:k_africae.holder + change = scope:title_change + } + } + change_liege = { + liege = title:k_africae.holder.top_liege + change = scope:title_change + } + resolve_title_and_vassal_change = scope:title_change + } + if = { + limit = { + scope:vandal_expel = { + is_landed = no + } + character:vandals_012 = { + is_alive = yes + is_landed = yes + } + } + character:vandals_012 = { + add_courtier = scope:vandal_expel + } + } + } + } + } + } + } + add_culture_minority_effect = { + CULTURE = culture:vandal + SIZE = small + COUNTY = title:c_upper_khabur + } + add_culture_minority_effect = { + CULTURE = culture:vandal + SIZE = small + COUNTY = title:c_amida + } + add_culture_minority_effect = { + CULTURE = culture:vandal + SIZE = small + COUNTY = title:c_tall_basma + } + } + + on_invalidated_desc = msg_invalidate_war_title + + check_defender_inheritance_validity = no + + on_primary_attacker_death = inherit + on_primary_defender_death = inherit + + attacker_allies_inherit = yes + defender_allies_inherit = yes + + transfer_behavior = transfer + + war_name = "INDEPENDENCE_WAR_NAME" + + interface_priority = 120 + + attacker_wargoal_percentage = 0.8 + + max_attacker_score_from_battles = 100 + max_defender_score_from_battles = 50 + + max_defender_score_from_occupation = 150 + max_attacker_score_from_occupation = 150 + + max_ai_diplo_distance_to_title = 500 +} + } + { +radagaisus_invasion_cb = { + group = event + + allowed_for_character = { + } + + allowed_against_character = { + scope:attacker = { + ALL_FALSE = { + top_liege = scope:defender.top_liege + liege = scope:defender + } + } + } + + combine_into_one = yes + + target_titles = none + target_title_tier = all + target_de_jure_regions_above = yes + ignore_effect = change_title_holder + ai_only_against_neighbors = yes + defender_ticking_warscore_delay = { years = 2 } + + white_peace_possible = no + + valid_to_start = { + always = no + } + + should_invalidate = { + NOT = { + any_in_list = { + list = target_titles + any_in_de_jure_hierarchy = { + tier = tier_county + holder = { + OR = { + this = scope:defender + target_is_liege_or_above = scope:defender + } + } + } + } + } + } + + on_invalidated_desc = msg_religious_war_invalidation_region_message + + on_invalidated = { + } + + cost = { + } + + on_declaration = { + on_declared_war = yes + } + + on_victory_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:attacker = { is_local_player = yes } } + desc = radagaisus_invasion_victory_desc_attacker + } + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = radagaisus_invasion_victory_desc_defender + } + desc = radagaisus_invasion_victory_desc + } + } + + on_victory = { + #EP2 accolade glory gain for winning against higher ranked enemy + scope:attacker = { accolade_attacker_war_end_glory_gain_high_effect = yes } + scope:attacker = { show_pow_release_message_effect = yes } + scope:defender = { + trigger_event = { + id = gothic_wars.0014 + days = 1 + } + } + + create_title_and_vassal_change = { + type = conquest_holy_war + save_scope_as = change + add_claim_on_loss = yes + } + # go through the dejure hierarchy under target titles, transfer titles with same or worse tolerance holders (their religion equaly or less tolerated than the defender's), + # take the holder as vassal otherwise and don't go deeper + every_in_list = { + list = target_titles + custom_tooltip = RELIGIOUS_CB_TITLE + + conquest_cb_title_transfer = { + RELIGIOUS_WAR = yes + } + } + + every_in_list = { + list = vassals_taken + change_liege = { + liege = scope:attacker + change = scope:change + } + } + + every_in_list = { + list = titles_taken + change_title_holder = { + holder = scope:attacker + change = scope:change + take_baronies = yes + } + } + + resolve_title_and_vassal_change = scope:change + + # Prestige Progress for the Attacker + every_in_list = { + list = target_titles + scope:attacker = { + add_prestige_experience = medium_prestige_value + } + } + + # Allies on both sides get full prestige value for helping in the war, based on their war participation. + modify_allies_of_participants_fame_values = { + WINNER = scope:attacker + FAME_BASE = medium_prestige_value + IS_RELIGIOUS_WAR = no + WINNER_ALLY_FAME_SCALE = 1 + LOSER_ALLY_FAME_SCALE = 1 + } + + # Truce + add_truce_attacker_victory_effect = yes + + # FP1: note the victory for future memorialisation via stele (if applicable) + scope:attacker = { fp1_remember_recent_conquest_victory_effect = yes } + } + + on_white_peace_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:attacker = { is_local_player = yes } } + desc = radagaisus_invasion_white_peace_desc_attacker + } + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = radagaisus_invasion_white_peace_desc_defender + } + desc = radagaisus_invasion_white_peace_desc + } + } + + on_defeat_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:attacker = { is_local_player = yes } } + desc = radagaisus_invasion_defeat_desc_attacker + } + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = radagaisus_invasion_defeat_desc_defender + } + desc = radagaisus_invasion_defeat_desc + } + } + + on_defeat = { + #EP2 accolade glory gain for winning against higher ranked enemy + scope:defender = { accolade_attacker_war_end_glory_gain_high_effect = yes } + scope:attacker = { show_pow_release_message_effect = yes } + + if = { + limit = { + exists = title:k_visigoths.holder + } + goths_flee_effect = yes + } + + # Prestige loss for the attacker + scope:attacker = { + save_temporary_scope_as = loser + pay_short_term_gold_reparations_effect = { + GOLD_VALUE = 5 + } + add_prestige = { + value = major_prestige_value + multiply = -1.0 + } + } + + # Prestige for Defender + scope:defender = { + add_prestige_war_defender_effect = { + PRESTIGE_VALUE = major_prestige_value + } + } + + # Allies on both sides get full prestige value for helping in the war, based on their war participation. + modify_allies_of_participants_fame_values = { + WINNER = scope:defender + FAME_BASE = medium_prestige_value + IS_RELIGIOUS_WAR = no + WINNER_ALLY_FAME_SCALE = 1 + LOSER_ALLY_FAME_SCALE = 1 + } + + lost_radagaisus_invasion_effect = yes + + add_truce_attacker_defeat_effect = yes + on_lost_aggression_war_discontent_loss = yes + } + + transfer_behavior = transfer + + on_primary_attacker_death = inherit + on_primary_defender_death = inherit + + attacker_allies_inherit = yes + defender_allies_inherit = yes + + war_name = RADAGAISUS_INVASION_NAME + war_name_base = RADAGAISUS_INVASION_NAME_BASE + cb_name = RADAGAISUS_INVASION_CB_NAME + + use_de_jure_wargoal_only = yes + + interface_priority = 100 +} + } + { + if = { + limit = { + character:armenian_02 = { + is_alive = yes + } + } + add_courtier = character:armenian_02 + } + } +} + +"common\casus_belli_types\TFE_event_wars_overflow.txt" = { + { +independence_war_berber = { + icon = independence_faction_war + group = event + ai = no # AI targeting is handled through game_rule events. + + allow_hostages = no + allowed_against_character = { + OR = { + scope:attacker = { + liege = scope:defender + } + scope:attacker = { + top_liege = scope:defender + } + } + } + + cost = { + piety = { + value = 0 + } + prestige = { + value = 0 + } + } + + on_declaration = { + on_declared_war = yes + # Remove offending HumSac modifiers. + scope:attacker = { + spawn_army = { + name = "Berber Tribesmen" + levies = 1000 + men_at_arms = { + type = bowmen + stacks = 2 + } + men_at_arms = { + type = desert_hussar + stacks = 2 + } + men_at_arms = { + type = light_footmen + stacks = 2 + } + location = province:4601 #Nemancha + inheritable = no + uses_supply = no + war = scope:war + } + } + scope:attacker = { + hidden_effect = { fp1_remove_humsac_offended_counties_effect = yes } + } + war = { + every_war_attacker = { + if = { + limit = { + top_liege = scope:defender + NOT = { culture = { has_same_culture_heritage = liege.culture } } + } + add_character_flag = should_become_independent + } + } + } } - { - modifier = { - add = 999 - exists = this - exists = character:syagri_06 #Syagrus - this = character:syagri_06 #Syagrus - } + + on_victory_desc = { + first_valid = { + triggered_desc = { + trigger = { # Desc for only one player attacker + scope:attacker = { + is_local_player = yes + } + } + desc = independence_war_victory_desc_local_player_attacker_alone + } + triggered_desc = { # Desc for only one attacker, player defender + trigger = { + scope:defender = { + is_local_player = yes + } + } + desc = player_independence_war_victory_desc_local_player_defender_attacker_alone + } + desc = independence_war_victory_desc_local_player_attacker_alone # Desc for a third party involved + } + } - { - modifier = { - add = 999 - exists = this - exists = character:rugian_03 #Feletheus - this = character:rugian_03 #Feletheus - } + + on_victory = { + scope:attacker = { show_pow_release_message_effect = yes } + + #EP2 Accolade glory gain from winning against higher ranked enemy + scope:attacker = { accolade_attacker_war_end_glory_gain_med_effect = yes } + + create_title_and_vassal_change = { + type = independency + save_scope_as = change + } + if = { + # Free character with the flag + limit = { exists = war } + war = { + every_war_attacker = { + if = { + limit = { + has_character_flag = should_become_independent + top_liege = scope:defender + } + + create_title_and_vassal_change = { + type = independency + save_scope_as = going_independent + add_claim_on_loss = no + } + becomes_independent = { + change = scope:going_independent + } + + resolve_title_and_vassal_change = scope:going_independent + + add_truce_both_ways = { + character = scope:defender + days = 1825 + war = root.war + result = victory + } + + remove_character_flag = should_become_independent + + change_liege_or_become_independent = { + CHANGE = scope:change + VASSAL = this + } + + hidden_effect = { + set_variable = { + name = independence_war_former_liege + value = scope:defender + } + + save_scope_as = current_member + + # Struggle Catalyst + if = { + limit = { + catalyst_gave_independence_to_powerful_diff_faith_culture_vassal_preliminary_trigger = { + CHAR1 = scope:defender + CHAR2 = scope:current_member + } + any_character_struggle = { + involvement = involved + activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:current_member + } + } + } + every_character_struggle = { + involvement = involved + limit = { + activate_struggle_catalyst_secondary_character_involvement_either_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:current_member + } + } + activate_struggle_catalyst = { + catalyst = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + character = scope:defender + } + } + } + } + } + } + } + } + + scope:defender = { + # Struggle Catalyst + hidden_effect = { + if = { + limit = { + catalyst_gave_independence_to_powerful_diff_faith_culture_vassal_preliminary_trigger = { + CHAR1 = scope:defender + CHAR2 = scope:attacker + } + any_character_struggle = { + involvement = involved + activate_struggle_catalyst_secondary_character_involvement_involved_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:attacker + } + } + } + every_character_struggle = { + involvement = involved + limit = { + activate_struggle_catalyst_secondary_character_involvement_either_trigger = { + CATALYST = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + CHAR = scope:attacker + } + } + activate_struggle_catalyst = { + catalyst = catalyst_gave_independence_to_powerful_diff_faith_culture_vassal + character = scope:defender + } + } + } + } + } + resolve_title_and_vassal_change = scope:change + } - { - modifier = { - add = 999 - exists = this - exists = character:6878 #jarl_haesteinn - this = character:6878 #jarl_haesteinn - } + + on_white_peace_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = player_independence_war_white_peace_defender_desc + } + triggered_desc = { + trigger = { + scope:attacker = { + is_local_player = yes + } + } + desc = player_independence_war_white_peace_attacker_desc + } + desc = player_independence_war_white_peace_desc + } + } - { - modifier = { - add = 999 - exists = this - exists = character:aelling_01 #Aelle - this = character:aelling_01 #Aelle - } + + on_white_peace = { + scope:attacker = { + show_pow_release_message_effect = yes + stress_impact = { + ambitious = medium_stress_impact_gain + arrogant = medium_stress_impact_gain + } + } + hidden_effect = { + scope:attacker = { + add_truce_both_ways = { + character = scope:defender + days = 1825 + war = root.war + result = white_peace + } + } + } + + scope:defender = { + add_prestige = minor_prestige_value + stress_impact = { + arrogant = medium_stress_impact_gain + } + } } - { - modifier = { - add = 999 - exists = this - exists = character:6448 #count_eudes - this = character:6448 #count_eudes - } + + on_defeat_desc = { + first_valid = { + triggered_desc = { + trigger = { scope:defender = { is_local_player = yes } } + desc = player_independence_defeat_defender_desc + } + triggered_desc = { + trigger = { + scope:attacker = { + is_local_player = yes + } + } + desc = player_independence_defeat_attacker_desc + } + desc = player_independence_war_defeat_desc + } + } - { - modifier = { - add = 999 - exists = this - exists = character:107500 #king_sancho - this = character:107500 #king_sancho - } + + on_defeat = { + scope:attacker = { show_pow_release_message_effect = yes } + scope:defender = { + add_dread = medium_dread_gain + # Prestige for Defender + add_prestige_war_defender_effect = { + PRESTIGE_VALUE = medium_prestige_value + } + } + if = { + limit = { exists = war } + war = { + every_war_attacker = { + limit = { + top_liege = scope:defender + } + hard_imprison_character_effect = { + TARGET = this + IMPRISONER = scope:defender + } + scope:defender = { + add_opinion = { + target = prev + modifier = vassal_lost_faction_revolt_war + } + } + } + } + } + if = { + limit = { + character:thracio_03 = { + is_landed = yes + top_liege = scope:defender + is_imprisoned = yes + } + } + character:thracio_03 = { + depose = yes + release_from_prison = yes + } + } + if = { + limit = { + exists = title:k_mauro_roman_kingdom.holder + } + title:k_mauro_roman_kingdom.holder = { + add_courtier = character:thracio_03 + } + character:thracio_03 = { + add_unpressed_claim = title:k_mauro_roman_kingdom + } + } + if = { + limit = { + war = { + any_war_attacker = { has_title = title:d_avaritana } + } + war = { + any_war_defender = { has_title = title:d_zaba } + } + } + create_title_and_vassal_change = { + type = swear_fealty + save_scope_as = change + add_claim_on_loss = no + } + + if = { + limit = { + title:d_avaritana.holder.primary_title.tier < title:d_zaba.holder.primary_title.tier + } + title:d_avaritana.holder = { + change_liege = { + liege = title:d_zaba.holder + change = scope:change + } + } + } + else = { + title:d_avaritana.holder = { + every_held_title = { + if = { + limit = { + tier = title:d_avaritana.holder.primary_title.tier + } + change_title_holder = { + holder = title:d_zaba.holder + change = scope:change + } + } + else_if = { + limit = { + OR = { + NOT = { exists = scope:secondary_title } + tier > scope:secondary_title.tier + } + } + save_temporary_scope_as = secondary_title + } + } + } + + title:d_avaritana.holder = { + if = { + limit = { + exists = scope:secondary_title + } + every_vassal = { + limit = { + primary_title.tier >= scope:secondary_title.tier + NOT = { + primary_title.tier = tier_barony + } + } + change_liege = { + liege = title:d_zaba.holder + change = scope:change + } + } + } + } + + title:d_avaritana.holder = { + change_liege = { + liege = title:d_zaba.holder + change = scope:change + } + } + } + + resolve_title_and_vassal_change = scope:change + + title:d_avaritana.holder = { + destroy_title = title:d_avaritana + } + } } - { - modifier = { - add = 999 - exists = this - exists = character:214 #king_philippe - this = character:214 #king_philippe - } + + on_invalidated_desc = msg_invalidate_war_title + + check_defender_inheritance_validity = no + + on_primary_attacker_death = inherit + on_primary_defender_death = inherit + + attacker_allies_inherit = yes + defender_allies_inherit = yes + + transfer_behavior = transfer + + war_name = "INDEPENDENCE_WAR_NAME" + + interface_priority = 120 + + attacker_wargoal_percentage = 0.8 + + max_attacker_score_from_battles = 100 + max_defender_score_from_battles = 50 + + max_defender_score_from_occupation = 150 + max_attacker_score_from_occupation = 150 + + max_ai_diplo_distance_to_title = 500 +} } } -"common\casus_belli_types\TFE_event_wars.txt" = { - { - NOT = { THIS = character:vandals_012 } - } +"common/scripted_effects/TFE_invasion_effects.txt" = { { - if = { +lost_radagaisus_invasion_effect = { + if = { + limit = { + exists = title:k_goths.holder + } + title:k_goths.holder = { + if = { # Imprison them if they aren't imprisoned. limit = { - character:armenian_02 = { + is_imprisoned = no + character:900062 = { is_alive = yes } } - add_courtier = character:armenian_02 + + hard_imprison_character_effect = { + TARGET = this + IMPRISONER = character:900062 + } + trigger_event = { + id = gothic_wars.0016 + days = 7 + } + } + else = { + limit = { + is_imprisoned = no + } + hard_imprison_character_effect = { + TARGET = this + IMPRISONER = scope:defender + } } + } + } +} } } @@ -4202,4 +5584,21 @@ beards_scripted_characters = { } } } -} \ No newline at end of file +} + +"gfx\portraits\portrait_modifiers\00_custom_hair.txt" = { + { + modifier = { + add = 200 + exists = this + exists = character:easteregg_joe_parkin + this = character:easteregg_joe_parkin + } + modifier = { + add = 200 + exists = this + exists = character:easteregg_alessandro_bragalini + this = character:easteregg_alessandro_bragalini + } + } +} From 55659aab8bab0e00ef4853bc22c1c5d60a458e34 Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 18:41:44 +0100 Subject: [PATCH 09/13] Removed undated succession_laws entries from history --- ImperatorToCK3/CK3/Titles/LandedTitles.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index d32632e89..ecf7b2189 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -338,6 +338,15 @@ public void CleanUpHistory(CharacterCollection characters, Date ck3BookmarkDate) } } } + + // Remove undated succession_laws entries; the game doesn't seem to like them. + foreach (var title in this) { + if (!title.History.Fields.TryGetValue("succession_laws", out var successionLawsField)) { + continue; + } + + successionLawsField.InitialEntries.RemoveAll(entry => true); + } } internal void ImportImperatorCountries( From 6e58d3016df91f2901a09065b9c5fe7d36bd784c Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 21:24:49 +0100 Subject: [PATCH 10/13] Update removable_file_blocks_tfe.txt --- .../removable_file_blocks_tfe.txt | 1208 ++++++++++++++++- 1 file changed, 1155 insertions(+), 53 deletions(-) diff --git a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt index df2338bf9..55d656ba1 100644 --- a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt +++ b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt @@ -2377,87 +2377,1011 @@ on_TFE_east_asia_start = { this = character:aelling_01 #Aelle } } + + { + modifier = { + add = 999 + exists = this + exists = character:easteregg_elisabeth_gangenes + this = character:easteregg_elisabeth_gangenes + } + } + { + modifier = { + add = 999 + exists = this + exists = character:7757 #duchess_matilda + this = character:7757 #duchess_matilda + } + modifier = { + add = 999 + exists = this + exists = character:102505 #queen_ingebjorg + this = character:102505 #queen_ingebjorg + } + modifier = { + add = 999 + exists = this + exists = character:765 #princess_swietoslawa + this = character:765 #princess_swietoslawa + } + modifier = { + add = 999 + exists = this + exists = character:930551279 #eudoxia + this = character:930551279 #eudoxia + } + modifier = { + add = 999 + exists = this + exists = character:placidia_01 #placidia + this = character:placidia_01 #placidia + } + modifier = { + add = 999 + exists = this + exists = character:900065 #serena + this = character:900065 #serena + } + modifier = { + add = 999 + exists = this + exists = character:992020 #Amalasuntha + this = character:992020 #Amalasuntha + } + modifier = { + add = 999 + exists = this + exists = character:992024 #Matasuntha + this = character:992024 #Matasuntha + } + } + { + modifier = { + add = 999 + exists = this + exists = character:108501 #infanta_urraca + this = character:108501 #infanta_urraca + } + modifier = { + add = 999 + exists = this + exists = character:131 #eadgifu_the_fair + this = character:131 #eadgifu_the_fair + } + } + { + modifier = { + add = 999 + exists = this + exists = character:633 #queen_yelizaveta + this = character:633 #queen_yelizaveta + } + } + { + modifier = { + add = 999 + exists = this + exists = character:easteregg_bianca_savazzi + this = character:easteregg_bianca_savazzi + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_claudia_baldassi + this = character:easteregg_claudia_baldassi + } + } + { + modifier = { + add = 999 + exists = this + exists = character:6863 #ingrid_bjornsdottir + this = character:6863 #ingrid_bjornsdottir + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_linnea_thimren + this = character:easteregg_linnea_thimren + } + } + { + modifier = { + add = 999 + exists = this + exists = character:6839 #iliana_of_uppland + this = character:6839 #iliana_of_uppland + } + modifier = { + add = 999 + exists = this + exists = character:161257 #queen_wyszeslawa + this = character:161257 #queen_wyszeslawa + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_steacy_mcilwham + this = character:easteregg_steacy_mcilwham + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_katya_boestad + this = character:easteregg_katya_boestad + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_tegan_harris + this = character:easteregg_tegan_harris + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_bahar_shefket + this = character:easteregg_bahar_shefket + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_alexia_belfort + this = character:easteregg_alexia_belfort + } + } + { + modifier = { + add = 999 + exists = this + exists = character:997005 #Chlodovech + this = character:997005 #Chlodovech + } + modifier = { + add = 999 + exists = character:997013 #Chlothar + this = character:997013 #Chlothar + } + modifier = { + add = 999 + exists = this + exists = character:997015 #Theodobert + this = character:997015 #Theodobert + } + } + { + modifier = { + add = 999 + exists = this + exists = character:123 #queen_ealdgyth + this = character:123 #queen_ealdgyth + } + modifier = { + add = 999 + exists = this + exists = character:367 #duchess_mathilde + this = character:367 #duchess_mathilde + } + } + { + modifier = { + add = 999 + exists = this + exists = character:145072 #Focas + this = character:145072 #Focas + } + modifier = { + add = 999 + exists = this + exists = character:145071 #Heraclius + this = character:145071 #Heraclius + } + modifier = { + add = 999 + exists = this + exists = character:armenian_01 #Narses + this = character:armenian_01 #Narses + } + modifier = { + add = 999 + exists = this + exists = character:greek_17 #Plutarch + this = character:greek_17 #Plutarch + } + } + { + modifier = { + add = 999 + exists = this + exists = character:6448 #count_eudes + this = character:6448 #count_eudes + } + modifier = { + add = 999 + exists = this + exists = character:107500 #king_sancho + this = character:107500 #king_sancho + } + modifier = { + add = 999 + exists = this + exists = character:214 #king_philippe + this = character:214 #king_philippe + } + modifier = { + add = 999 + exists = this + exists = character:146 #william_the_red + this = character:146 #william_the_red + } + } + { + modifier = { + add = 999 + exists = this + exists = character:163112 #halfdan_whiteshirt + this = character:163112 #halfdan_whiteshirt + } + modifier = { + add = 999 + exists = this + exists = character:30228 #king_louis + this = character:30228 #king_louis + } + modifier = { + add = 999 + exists = this + exists = character:984 #king_malcom + this = character:984 #king_malcom + } + modifier = { + add = 999 + exists = this + exists = character:212892 #ota_the_handsome + this = character:212892 #ota_the_handsome + } + modifier = { + add = 999 + exists = this + exists = character:762 #king_boleslaw + this = character:762 #king_boleslaw + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_joel_hansson + this = character:easteregg_joel_hansson + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_peter_johannesson + this = character:easteregg_peter_johannesson + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_petter_vilberg + this = character:easteregg_petter_vilberg + } + + modifier = { + add = 999 + exists = this + exists = character:168137 + this = character:168137 + } + modifier = { + add = 999 + exists = this + exists = character:200290 #Atawulf + this = character:200290 #Arawulf + } + modifier = { + add = 999 + exists = this + exists = character:180618 #Bahram + this = character:180618 #Bahram + } + modifier = { + add = 999 + exists = this + exists = character:997004 #Childeric + this = character:997004 #Childeric + } + modifier = { + add = 999 + exists = this + exists = character:997009 #Theodoric Meroving + this = character:997009 #Theodoric Meroving + } + modifier = { + add = 999 + exists = this + exists = character:997011 #Chlodomir + this = character:997011 #Chlodomir + } + } + { + modifier = { + add = 999 + exists = this + exists = character:3924 #emir_yahya + this = character:3924 #emir_yahya + } + modifier = { + add = 999 + exists = this + exists = character:106000 #king_antso + this = character:106000 #king_antso + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_alexander_oltner + this = character:easteregg_alexander_oltner + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_ismael_serrano + this = character:easteregg_ismael_serrano + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_christian_daflos + this = character:easteregg_christian_daflos + } + modifier = { + add = 999 + exists = this + exists = character:70517 #Leo + this = character:70517 #Leo + } + modifier = { + add = 999 + exists = this + exists = character:mauro_roman_kings_02 #Massonas + this = character:mauro_roman_kings_02 #Massonas + } + } + { + modifier = { + add = 999 + exists = this + exists = character:205141 #Ceredig + this = character:205141 #Ceredig + } + modifier = { + add = 999 + exists = this + exists = character:70512 #Justinian + this = character:70512 #Justinian + } + modifier = { + add = 999 + exists = this + exists = character:cappadocia_07 #Ioannes + this = character:cappadocia_07 #Ioannes + } + } + { + modifier = { + add = 999 + exists = this + exists = character:quadi_04 # Hermerich of the Quadi + this = character:quadi_04 # Hermerich of the Quadi + } + } + { + modifier = { + add = 400 + exists = this + exists = character:83355 #petty_king_murchad + this = character:83355 #petty_king_murchad + } + modifier = { + add = 999 + exists = this + exists = character:109500 #king_garcia + this = character:109500 #king_garcia + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_henrik_fahraeus + this = character:easteregg_henrik_fahraeus + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_jakub_potapczyk + this = character:easteregg_jakub_potapczyk + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_petter_lundh + this = character:easteregg_petter_lundh + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_max_weltz + this = character:easteregg_max_weltz + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_max_collin + this = character:easteregg_max_collin + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_martin_anward + this = character:easteregg_martin_anward + } + modifier = { + add = 999 + exists = this + exists = character:6392 #charlemagne + this = character:6392 #charlemagne + } + } + { + modifier = { + add = 999 + exists = this + exists = character:522 #duke_vratislav + this = character:522 #duke_vratislav + } + modifier = { + add = 999 + exists = this + exists = character:108500 #king_alfonso + this = character:108500 #king_alfonso + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_sean_hughes + this = character:easteregg_sean_hughes + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_paul_depre + this = character:easteregg_paul_depre + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_zack_holmgren + this = character:easteregg_zack_holmgren + } + modifier = { + add = 999 + exists = this + exists = character:159431 #Conan Meriadoc + this = character:159431 #tiberius + } + modifier = { + add = 999 + exists = this + exists = character:999103 #king_alaric + this = character:999103 #king_alaric + } + modifier = { + add = 999 + exists = this + exists = character:159038 #Coel + this = character:159038 #ACoel + } + modifier = { + add = 999 + exists = this + exists = character:constantinus_05 #Ambrosius + this = character:constantinus_05 #Ambrosius + } + modifier = { + add = 999 + exists = this + exists = character:mauri_42 #Iabdas + this = character:mauri_42 #Iabdas + } + modifier = { + add = 999 + exists = this + exists = character:997002 #Chlodio + this = character:997002 #Chlodio + } + } + { + modifier = { + add = 999 + exists = this + exists = character:easteregg_james_beaumont + this = character:easteregg_james_beaumont + } + modifier = { + add = 999 + exists = this + exists = character:maldras_06 #Hermenerich + this = character:maldras_06 #Hermenerich + } + modifier = { + add = 999 + exists = this + exists = character:982001 #Abu Karib + this = character:982001 #Abu Karib + } + modifier = { + add = 999 + exists = this + exists = character:xionite_001 #Kidara + this = character:xionite_001 #Kidara + } + modifier = { + add = 999 + exists = this + exists = character:samo_01 #Samo + this = character:samo_01 #Samo + } + } + { + modifier = { + add = 999 + exists = this + exists = character:90104 #charles_the_bald + this = character:90104 #charles_the_bald + } + modifier = { + add = 999 + exists = this + exists = character:1316 #emperor_heinrich + this = character:1316 #emperor_heinrich + } + modifier = { + add = 999 + exists = this + exists = character:992016 #theodoric_the_great + this = character:992016 #theodoric_the_great + } + modifier = { + add = 999 + exists = this + exists = character:83432 #Eochaid + this = character:83432 #Eochaid + } + } + { + modifier = { + modifier = { + add = 999 + exists = this + exists = character:easteregg_nils_wadensten + this = character:easteregg_nils_wadensten + } + add = 999 + exists = this + exists = character:900062 #stilicho + this = character:900062 #stilicho + } + modifier = { + add = 999 + exists = this + exists = character:70519 #Imperator Arcadius I + this = character:70519 #Imperator Arcadius I + } + modifier = { + add = 999 + exists = this + exists = character:145227 #Imperator Honorius I + this = character:145227 #Imperator Honorius I + } + modifier = { + add = 999 + exists = this + exists = character:nepos_02 #Nepos + this = character:nepos_02 #Nepos + } + modifier = { + add = 999 + exists = this + exists = character:145237 #julian_the_apostate + this = character:145237 #julian_the_apostate + } + modifier = { + add = 999 + exists = this + exists = character:londinium_01 #Riothamus + this = character:londinium_01 #Riothamus + } + modifier = { + add = 999 + exists = this + exists = character:arsacid_58 #vramshapuh + this = character:arsacid_58 #vramshapuh + } + modifier = { + add = 999 + exists = this + exists = character:vandals_005 #Hilderic + this = character:vandals_005 #Hilderic + } + modifier = { + add = 999 + exists = this + exists = character:992022 #Theodahad + this = character:992022 #Theodahad + } + modifier = { + add = 999 + exists = this + exists = character:991004 #Mundus + this = character:991004 #Mundus + } + modifier = { + add = 999 + exists = this + exists = character:greek_20 #Proklos + this = character:greek_20 #Proklos + } + } + { + modifier = { + add = 999 + exists = this + exists = character:nuvelan_11 #Gildo + this = character:nuvelan_11 #Gildo + } + modifier = { + add = 999 + exists = this + exists = character:aksum_16 #Ouazeba + this = character:aksum_16 #Ouazeba + } + } + { + modifier = { + add = 999 + exists = this + exists = character:easteregg_magne_skjaeran + this = character:easteregg_magne_skjaeran + } + } + { + modifier = { + modifier = { + add = 999 + exists = this + exists = character:163111 #ivar_the_boneless + this = character:163111 #ivar_the_boneless + } + modifier = { + add = 999 + exists = this + exists = character:102531 #harald_hardrade + this = character:102531 #harald_hardrade + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_joacim_carlberg + this = character:easteregg_joacim_carlberg + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_struan_mccallum + this = character:easteregg_struan_mccallum + } + add = 999 + exists = this + exists = character:999105 #athaulf + this = character:999105 #athaulf + } + modifier = { + add = 999 + exists = this + exists = character:997003 #Merovech + this = character:997003 #Merovech + } + modifier = { + add = 999 + exists = this + exists = character:992003 #Hermanaric + this = character:992003 #Hermanaric + } + } + { + modifier = { + add = 999 + exists = this + exists = character:163110 #sigurdr_snake_in_the_eye + this = character:163110 #sigurdr_snake_in_the_eye + } + modifier = { + add = 999 + exists = this + exists = character:144000 #haraldr_fairhair + this = character:144000 #haraldr_fairhair + } + modifier = { + add = 999 + exists = this + exists = character:40605 #rurik_rurikid + this = character:40605 #rurik_rurikid + } + modifier = { + add = 999 + exists = this + exists = character:easteregg_jonas_wickerstrom + this = character:easteregg_jonas_wickerstrom + } + modifier = { + add = 999 + exists = this + exists = character:900016 #faramund + this = character:900016 #faramund + } + } + { + modifier = { + add = 999 + exists = this + exists = character:163108 #bjorn_ironside + this = character:163108 #bjorn_ironside + } + modifier = { + add = 999 + exists = this + exists = character:140 #william_the_bastard + this = character:140 #william_the_bastard + } + modifier = { + add = 999 + exists = this + exists = character:101515 #king_svend + this = character:101515 #king_svend + } + modifier = { + add = 999 + exists = this + exists = character:42018 #karlmann + this = character:42018 #karlmann + } + } + { + modifier = { + add = 999 + exists = this + exists = character:159137 #almos_arpad + this = character:159137 #almos_arpad + } + } + { + modifier = { + add = 999 + exists = this + exists = character:alchonid_005 #Khingila + this = character:alchonid_005 #Khingila + } + modifier = { + add = 999 + exists = this + exists = character:hephthalite_misc_017 #Katulf + this = character:hephthalite_misc_017 #Katulf + } + } + { + modifier = { + add = 999 + exists = this + exists = character:belisarius_001 #Belisarius + this = character:belisarius_001 #Belisarius + } + } + { + modifier = { + add = 999 + exists = this + exists = character:200284 #euric + this = character:200284 #euric + } + modifier = { + add = 999 + exists = this + exists = character:180628 #Khosrau + this = character:180628 #Khosrau + } + modifier = { + add = 999 + exists = this + exists = character:mauri_36 #Masties + this = character:mauri_36 #Masties + } + } + { + modifier = { + add = 999 + exists = this + exists = character:danis0005 + this = character:danis0005 + } + + modifier = { + add = 999 + exists = this + exists = character:surunbaqi0001 + this = character:surunbaqi0001 + } + modifier = { + add = 999 + exists = this + exists = character:107590 #el_cid + this = character:107590 #el_cid + } + modifier = { + add = 999 + exists = this + exists = character:159012 #Cadwallon + this = character:159012 #Cadwallon + } + modifier = { + add = 999 + exists = this + exists = character:ashina_03 #Tuwu + this = character:ashina_03 #Tuwu + } + modifier = { + add = 999 + exists = this + exists = character:ashina_05 #Istemi + this = character:ashina_05 #Istemi + } + } { modifier = { add = 999 - exists = this - exists = character:6448 #count_eudes - this = character:6448 #count_eudes + exists = this + exists = character:200280 #Theodis + this = character:200280 #Theodis + } + modifier = { + add = 999 + exists = this + exists = character:ashina_04 #Bumin + this = character:ashina_04 #Bumin + } + modifier = { + add = 999 + exists = this + exists = character:waegmunding_2 #Beowulf + this = character:waegmunding_2 #Beowulf } } { modifier = { add = 999 - exists = this - exists = character:107500 #king_sancho - this = character:107500 #king_sancho + exists = this + exists = character:996002 #odoacer + this = character:996002 #odoacer + } + modifier = { + add = 999 + exists = this + exists = character:992023 #Athalaric + this = character:992023 #Athalaric + } + modifier = { + add = 999 + exists = this + exists = character:992063 #Fritigern + this = character:992063 #Fritigern } } { modifier = { add = 999 - exists = this - exists = character:214 #king_philippe - this = character:214 #king_philippe + exists = this + exists = character:900016 #Faramund + this = character:900016 #Faramund + } + modifier = { + add = 999 + exists = character:990006 #Attila + this = character:990006 #Attila + } + modifier = { + add = 999 + exists = this + exists = character:997012 #Childebert + this = character:997012 #Childebert } } { modifier = { add = 999 exists = this - exists = character:easteregg_elisabeth_gangenes - this = character:easteregg_elisabeth_gangenes + exists = character:vandals_012 #Gelimer + this = character:vandals_012 #Gelimer + } + modifier = { + add = 999 + exists = this + exists = character:marshalnsc + this = character:marshalnsc } } { modifier = { add = 999 exists = this - exists = character:7757 #duchess_matilda - this = character:7757 #duchess_matilda + exists = character:168314 #waldrada + this = character:168314 #waldrada } modifier = { add = 999 exists = this - exists = character:102505 #queen_ingebjorg - this = character:102505 #queen_ingebjorg + exists = character:1183 #empress_bertha + this = character:1183 #empress_bertha } + } + { modifier = { add = 999 exists = this - exists = character:765 #princess_swietoslawa - this = character:765 #princess_swietoslawa + exists = character:251187 #daurama_daura + this = character:251187 #daurama_daura } - modifier = { - add = 999 + } + { + modifier = { + add = 999 exists = this - exists = character:930551279 #eudoxia - this = character:930551279 #eudoxia + exists = character:73683 + this = character:73683 } - modifier = { - add = 999 + modifier = { + add = 999 exists = this - exists = character:placidia_01 #placidia - this = character:placidia_01 #placidia + exists = character:vandals_003 + this = character:vandals_003 + } + } + { + modifier = { + add = 999 + exists = this + exists = character:73759 + this = character:73759 + } + } + { + modifier = { + add = 999 + exists = this + exists = character:73857 + this = character:73857 } + modifier = { - add = 999 + add = 999 exists = this - exists = character:900065 #serena - this = character:900065 #serena + exists = character:70292 + this = character:70292 + } + } + { + modifier = { + add = 999 + exists = this + exists = character:73783 + this = character:73783 } - modifier = { - add = 999 - exists = this - exists = character:992020 #Amalasuntha - this = character:992020 #Amalasuntha - } - modifier = { - add = 999 - exists = this - exists = character:992024 #Matasuntha - this = character:992024 #Matasuntha - } } } @@ -4332,10 +5256,25 @@ dong_zhuo_culture_decision = { } } -"gfx/portraits/portrait_modifiers/50_beards_scripted_characters.txt" = { +"gfx/portraits/portrait_modifiers/00_custom_hair.txt" = { { -# We can use these modifiers for adding specific beards and beards to historical and vanity characters + modifier = { + add = 200 + exists = this + exists = character:easteregg_joe_parkin + this = character:easteregg_joe_parkin + } + modifier = { + add = 200 + exists = this + exists = character:easteregg_alessandro_bragalini + this = character:easteregg_alessandro_bragalini + } + } +} +"gfx/portraits/portrait_modifiers/50_beards_scripted_characters.txt" = { + { beards_scripted_characters = { usage = game @@ -5586,19 +6525,182 @@ beards_scripted_characters = { } } -"gfx\portraits\portrait_modifiers\00_custom_hair.txt" = { +"gfx/portraits/portrait_modifiers/50_headgear_scripted_characters.txt" = { { - modifier = { - add = 200 - exists = this - exists = character:easteregg_joe_parkin - this = character:easteregg_joe_parkin +headgear_scripted_characters = { + + usage = game + selection_behavior = max + priority = 10 + + no_headgear = { # No headgear + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = fp2_scripted_headgear_01 + value = 0.1 # For the randomness to work correctly } - modifier = { - add = 200 - exists = this - exists = character:easteregg_alessandro_bragalini - this = character:easteregg_alessandro_bragalini + } + weight = { + base = 0 + modifier = { + add = 50 + exists = this + exists = character:73857 + this = character:73857 + } + modifier = { + add = 50 + exists = this + exists = character:108501 + this = character:108501 + } + modifier = { + add = 999 + exists = this + exists = character:900062 #Stilicho + this = character:900062 #Stilicho + } + modifier = { + add = 999 + exists = this + exists = character:nuvelan_11 #Gildo + this = character:nuvelan_11 #Gildo + } + modifier = { + add = 999 + exists = this + exists = character:belisarius_001 #Belisarius + this = character:belisarius_001 #Belisarius + } + } + } + + male_headgear_secular_fp2_iberian_muslim_common_01_low = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = fp2_scripted_headgear_01 + value = 0.5 # For the randomness to work correctly + } + } + weight = { + base = 0 + modifier = { + add = 50 + exists = this + exists = character:73813 # Musa + this = character:73813 + } + } + } + + male_headgear_secular_fp2_iberian_muslim_high_nobility_01 = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = fp2_scripted_headgear_01 + value = 1 # For the randomness to work correctly } + } + weight = { + base = 0 + modifier = { + add = 50 + exists = this + exists = character:danis0005 # Adanis + this = character:danis0005 + } + } + } + male_headgear_secular_roman_pannonian_hat_high_nobility = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = roman_pannonian_hat_high + value = 1 + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:nepos_02 #Nepos + this = character:nepos_02 #Nepos + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:syagri_06 #Syagrius + this = character:syagri_06 #Syagrius + } + } + } + male_headgear_secular_western_high_nobility = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = western_high_nobility + value = 1 + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:900016 #Faramund + this = character:900016 #Faramund + } + } + } + male_headgear_secular_roman_diadem = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = roman_diadem + value = 1 + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:70515 #Zeno + this = character:70515 #Zeno + } + } + } + male_headgear_secular_sassanid_crown = { + dna_modifiers = { + accessory = { + mode = add + gene = headgear + template = ep1_sassanid_crown + value = 1 + } + } + weight = { + base = 0 + modifier = { + add = 999 + exists = this + exists = character:180628 #Khosrau + this = character:180628 #Khosrau + } + } } } + } +} \ No newline at end of file From 1f6dc85962e4032e077750eeca3c8cb7df471b00 Mon Sep 17 00:00:00 2001 From: iht Date: Mon, 6 Jan 2025 21:30:01 +0100 Subject: [PATCH 11/13] Fixup for unreformed faiths without reformed_icon --- ImperatorToCK3/CK3/Religions/Faith.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ImperatorToCK3/CK3/Religions/Faith.cs b/ImperatorToCK3/CK3/Religions/Faith.cs index 8d769b394..7c792e318 100644 --- a/ImperatorToCK3/CK3/Religions/Faith.cs +++ b/ImperatorToCK3/CK3/Religions/Faith.cs @@ -24,6 +24,13 @@ public Faith(string id, FaithData faithData, Religion religion) { DoctrineIds = faithData.DoctrineIds.ToOrderedSet(); holySiteIds = faithData.HolySiteIds.ToOrderedSet(); attributes = [.. faithData.Attributes]; + + // Fixup for issue found in TFE: add reformed_icon if faith has unreformed_faith_doctrine. + if (DoctrineIds.Contains("unreformed_faith_doctrine") && !attributes.Any(pair => pair.Key == "reformed_icon")) { + // Use the icon attribute. + var icon = attributes.FirstOrDefault(pair => pair.Key == "icon"); + attributes = [.. attributes, new KeyValuePair("reformed_icon", icon.Value)]; + } } private readonly OrderedSet holySiteIds; From 49c6e9d0c792d8a3e046e619918ca904e9cfac59 Mon Sep 17 00:00:00 2001 From: iht Date: Tue, 7 Jan 2025 16:07:56 +0100 Subject: [PATCH 12/13] Remove invalid faiths and cultures from province history --- .../CK3/Characters/CharacterCollection.cs | 2 +- .../CK3/Provinces/ProvinceCollection.cs | 23 ++++++++++++++++--- ImperatorToCK3/CK3/World.cs | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs index 6e83f51bf..06086389b 100644 --- a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs +++ b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs @@ -836,7 +836,7 @@ public void RemoveUndefinedTraits(TraitMapper traitMapper) { } var traitsField = character.History.Fields["traits"]; - int removedCount = traitsField.RemoveAllEntries(value => !definedTraits.Contains(value.ToString() ?? string.Empty)); + int removedCount = traitsField.RemoveAllEntries(value => !definedTraits.Contains(value.ToString()?.RemQuotes() ?? string.Empty)); if (removedCount > 0) { Logger.Debug($"Removed {removedCount} undefined traits from character {character.Id}."); } diff --git a/ImperatorToCK3/CK3/Provinces/ProvinceCollection.cs b/ImperatorToCK3/CK3/Provinces/ProvinceCollection.cs index 80e6a3215..18c8ef4a8 100644 --- a/ImperatorToCK3/CK3/Provinces/ProvinceCollection.cs +++ b/ImperatorToCK3/CK3/Provinces/ProvinceCollection.cs @@ -1,6 +1,8 @@ using commonItems; using commonItems.Collections; using commonItems.Mods; +using ImperatorToCK3.CK3.Cultures; +using ImperatorToCK3.CK3.Religions; using ImperatorToCK3.CK3.Titles; using ImperatorToCK3.CommonUtils.Map; using ImperatorToCK3.Exceptions; @@ -9,8 +11,6 @@ using ImperatorToCK3.Mappers.Religion; using Microsoft.VisualBasic.FileIO; using System.Collections.Generic; -using System.Globalization; -using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -72,7 +72,7 @@ private void LoadProvincesHistory(ModFilesystem ck3ModFs) { parser.ParseGameFolder("history/provinces", ck3ModFs, "txt", recursive: true); } - public void ImportVanillaProvinces(ModFilesystem ck3ModFs) { + public void ImportVanillaProvinces(ModFilesystem ck3ModFs, ReligionCollection religions, CultureCollection cultures) { var existingProvinceDefinitionsCount = Count; Logger.Info("Importing vanilla provinces..."); @@ -83,6 +83,23 @@ public void ImportVanillaProvinces(ModFilesystem ck3ModFs) { LoadProvincesHistory(ck3ModFs); Logger.IncrementProgress(); + // Cleanup: remove invalid faith and culture entries from province history + var validFaithIds = religions.Faiths.Select(f => f.Id).ToHashSet(); + var validCultureIds = cultures.Select(c => c.Id).ToHashSet(); + foreach (var province in this) { + var faithField = province.History.Fields["faith"]; + int removedCount = faithField.RemoveAllEntries(value => !validFaithIds.Contains(value.ToString()?.RemQuotes() ?? string.Empty)); + if (removedCount > 0) { + Logger.Debug($"Removed {removedCount} invalid faith entries from province {province.Id}."); + } + + var cultureField = province.History.Fields["culture"]; + removedCount = cultureField.RemoveAllEntries(value => !validCultureIds.Contains(value.ToString()?.RemQuotes() ?? string.Empty)); + if (removedCount > 0) { + Logger.Debug($"Removed {removedCount} invalid culture entries from province {province.Id}."); + } + } + // Now load the provinces that don't have unique entries in history/provinces. // They instead use history/province_mapping. foreach (var (newProvinceId, baseProvinceId) in new ProvinceMappings(ck3ModFs)) { diff --git a/ImperatorToCK3/CK3/World.cs b/ImperatorToCK3/CK3/World.cs index 921acd9ad..2fdec76cd 100644 --- a/ImperatorToCK3/CK3/World.cs +++ b/ImperatorToCK3/CK3/World.cs @@ -313,7 +313,7 @@ public World(Imperator.World impWorld, Configuration config, Thread? irCoaExtrac // Now we can deal with provinces since we know to whom to assign them. We first import vanilla province data. // Some of it will be overwritten, but not all. - Provinces.ImportVanillaProvinces(ModFS); + Provinces.ImportVanillaProvinces(ModFS, Religions, Cultures); // Next we import Imperator provinces and translate them ontop a significant part of all imported provinces. Provinces.ImportImperatorProvinces(impWorld, MapData, LandedTitles, cultureMapper, religionMapper, provinceMapper, CorrectedDate, config); From 7ceeb1ed810dfdb689c14528f7043fd19e26994b Mon Sep 17 00:00:00 2001 From: iht Date: Tue, 7 Jan 2025 16:16:58 +0100 Subject: [PATCH 13/13] Remove more parts of TFE in generated mod --- .../removable_file_blocks_tfe.txt | 483 ++++++++++++++++++ 1 file changed, 483 insertions(+) diff --git a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt index 55d656ba1..59dfbe02f 100644 --- a/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt +++ b/ImperatorToCK3/Data_Files/configurables/removable_file_blocks_tfe.txt @@ -6703,4 +6703,487 @@ headgear_scripted_characters = { } } } +} + +"common/dna_data/00_dna_patrons.txt" = { + { +bitcoin_patron ={ + portrait_info={ + genes={ + hair_color={ 13 247 117 230 } + skin_color={ 159 149 199 103 } + eye_color={ 241 76 44 160 } + gene_chin_forward={ "chin_forward_neg" 125 "chin_forward_neg" 125 } + gene_chin_height={ "chin_height_neg" 114 "chin_height_neg" 114 } + gene_chin_width={ "chin_width_pos" 183 "chin_width_pos" 183 } + gene_eye_angle={ "eye_angle_pos" 133 "eye_angle_pos" 133 } + gene_eye_depth={ "eye_depth_neg" 119 "eye_depth_neg" 119 } + gene_eye_height={ "eye_height_pos" 131 "eye_height_pos" 131 } + gene_eye_distance={ "eye_distance_pos" 137 "eye_distance_pos" 137 } + gene_eye_shut={ "eye_shut_pos" 139 "eye_shut_pos" 139 } + gene_forehead_angle={ "forehead_angle_neg" 107 "forehead_angle_neg" 107 } + gene_forehead_brow_height={ "forehead_brow_height_neg" 105 "forehead_brow_height_neg" 105 } + gene_forehead_roundness={ "forehead_roundness_pos" 166 "forehead_roundness_pos" 166 } + gene_forehead_width={ "forehead_width_neg" 114 "forehead_width_neg" 114 } + gene_forehead_height={ "forehead_height_pos" 161 "forehead_height_pos" 161 } + gene_head_height={ "head_height_neg" 112 "head_height_neg" 86 } + gene_head_width={ "head_width_pos" 156 "head_width_pos" 131 } + gene_head_profile={ "head_profile_pos" 177 "head_profile_pos" 134 } + gene_head_top_height={ "head_top_height_pos" 0 "head_top_height_pos" 128 } + gene_head_top_width={ "head_top_width_pos" 125 "head_top_width_pos" 146 } + gene_jaw_angle={ "jaw_angle_neg" 105 "jaw_angle_neg" 105 } + gene_jaw_forward={ "jaw_forward_pos" 139 "jaw_forward_pos" 139 } + gene_jaw_height={ "jaw_height_pos" 129 "jaw_height_pos" 129 } + gene_jaw_width={ "jaw_width_neg" 101 "jaw_width_neg" 101 } + gene_mouth_corner_depth={ "mouth_corner_depth_pos" 130 "mouth_corner_depth_pos" 130 } + gene_mouth_corner_height={ "mouth_corner_height_neg" 127 "mouth_corner_height_neg" 127 } + gene_mouth_forward={ "mouth_forward_pos" 131 "mouth_forward_pos" 131 } + gene_mouth_height={ "mouth_height_neg" 114 "mouth_height_neg" 114 } + gene_mouth_width={ "mouth_width_pos" 137 "mouth_width_pos" 137 } + gene_mouth_upper_lip_size={ "mouth_upper_lip_size_pos" 151 "mouth_upper_lip_size_pos" 151 } + gene_mouth_lower_lip_size={ "mouth_lower_lip_size_neg" 91 "mouth_lower_lip_size_neg" 91 } + gene_mouth_open={ "mouth_open_neg" 115 "mouth_open_neg" 115 } + gene_neck_length={ "neck_length_neg" 141 "neck_length_neg" 76 } + gene_neck_width={ "neck_width_neg" 117 "neck_width_neg" 117 } + gene_bs_cheek_forward={ "cheek_forward_pos" 163 "cheek_forward_pos" 163 } + gene_bs_cheek_height={ "cheek_height_neg" 14 "cheek_height_neg" 14 } + gene_bs_cheek_width={ "cheek_width_neg" 9 "cheek_width_neg" 9 } + gene_bs_ear_angle={ "ear_angle_neg" 112 "ear_angle_neg" 112 } + gene_bs_ear_inner_shape={ "ear_inner_shape_pos" 11 "ear_inner_shape_pos" 11 } + gene_bs_ear_bend={ "ear_upper_bend_pos" 35 "ear_upper_bend_pos" 35 } + gene_bs_ear_outward={ "ear_outward_pos" 7 "ear_outward_pos" 7 } + gene_bs_ear_size={ "ear_size_pos" 119 "ear_size_pos" 119 } + gene_bs_eye_corner_depth={ "eye_corner_depth_pos" 243 "eye_corner_depth_pos" 243 } + gene_bs_eye_fold_shape={ "eye_fold_shape_pos" 149 "eye_fold_shape_pos" 149 } + gene_bs_eye_size={ "eye_size_neg" 37 "eye_size_neg" 37 } + gene_bs_eye_upper_lid_size={ "eye_upper_lid_size_pos" 15 "eye_upper_lid_size_pos" 15 } + gene_bs_forehead_brow_curve={ "forehead_brow_curve_neg" 48 "forehead_brow_curve_neg" 48 } + gene_bs_forehead_brow_forward={ "forehead_brow_forward_neg" 98 "forehead_brow_forward_neg" 98 } + gene_bs_forehead_brow_inner_height={ "forehead_brow_inner_height_neg" 51 "forehead_brow_inner_height_neg" 51 } + gene_bs_forehead_brow_outer_height={ "forehead_brow_outer_height_pos" 59 "forehead_brow_outer_height_pos" 59 } + gene_bs_forehead_brow_width={ "forehead_brow_width_pos" 30 "forehead_brow_width_pos" 30 } + gene_bs_jaw_def={ "jaw_def_neg" 19 "jaw_def_neg" 19 } + gene_bs_mouth_lower_lip_def={ "mouth_lower_lip_def_pos" 44 "mouth_lower_lip_def_pos" 44 } + gene_bs_mouth_lower_lip_full={ "mouth_lower_lip_full_pos" 60 "mouth_lower_lip_full_pos" 60 } + gene_bs_mouth_lower_lip_pad={ "mouth_lower_lip_pad_neg" 2 "mouth_lower_lip_pad_neg" 2 } + gene_bs_mouth_lower_lip_width={ "mouth_lower_lip_width_pos" 14 "mouth_lower_lip_width_pos" 14 } + gene_bs_mouth_philtrum_def={ "mouth_philtrum_def_pos" 51 "mouth_philtrum_def_pos" 51 } + gene_bs_mouth_philtrum_shape={ "mouth_philtrum_shape_neg" 23 "mouth_philtrum_shape_neg" 23 } + gene_bs_mouth_philtrum_width={ "mouth_philtrum_width_neg" 36 "mouth_philtrum_width_neg" 36 } + gene_bs_mouth_upper_lip_def={ "mouth_upper_lip_def_pos" 33 "mouth_upper_lip_def_pos" 33 } + gene_bs_mouth_upper_lip_full={ "mouth_upper_lip_full_pos" 24 "mouth_upper_lip_full_pos" 24 } + gene_bs_mouth_upper_lip_profile={ "mouth_upper_lip_profile_neg" 99 "mouth_upper_lip_profile_neg" 99 } + gene_bs_mouth_upper_lip_width={ "mouth_upper_lip_width_neg" 33 "mouth_upper_lip_width_neg" 33 } + gene_bs_nose_forward={ "nose_forward_pos" 255 "nose_forward_neg" 76 } + gene_bs_nose_height={ "nose_height_pos" 115 "nose_height_pos" 14 } + gene_bs_nose_length={ "nose_length_neg" 133 "nose_length_pos" 93 } + gene_bs_nose_nostril_height={ "nose_nostril_height_pos" 34 "nose_nostril_height_pos" 34 } + gene_bs_nose_nostril_width={ "nose_nostril_width_pos" 38 "nose_nostril_width_pos" 38 } + gene_bs_nose_profile={ "nose_profile_hawk" 62 "nose_profile_neg" 62 } + gene_bs_nose_ridge_angle={ "nose_ridge_angle_pos" 25 "nose_ridge_angle_pos" 25 } + gene_bs_nose_ridge_width={ "nose_ridge_width_neg" 20 "nose_ridge_width_neg" 20 } + gene_bs_nose_size={ "nose_size_pos" 53 "nose_size_pos" 53 } + gene_bs_nose_tip_angle={ "nose_tip_angle_neg" 33 "nose_tip_angle_neg" 33 } + gene_bs_nose_tip_forward={ "nose_tip_forward_neg" 42 "nose_tip_forward_neg" 42 } + gene_bs_nose_tip_width={ "nose_tip_width_pos" 21 "nose_tip_width_pos" 21 } + face_detail_cheek_def={ "cheek_def_01" 39 "cheek_def_01" 39 } + face_detail_cheek_fat={ "cheek_fat_01_pos" 0 "cheek_fat_01_neg" 45 } + face_detail_chin_cleft={ "chin_dimple" 16 "chin_dimple" 16 } + face_detail_chin_def={ "chin_def_neg" 214 "chin_def_neg" 214 } + face_detail_eye_lower_lid_def={ "eye_lower_lid_def" 119 "eye_lower_lid_def" 119 } + face_detail_eye_socket={ "eye_socket_03" 9 "eye_socket_03" 9 } + face_detail_nasolabial={ "nasolabial_01" 0 "nasolabial_01" 17 } + face_detail_nose_ridge_def={ "nose_ridge_def_pos" 1 "nose_ridge_def_pos" 1 } + face_detail_nose_tip_def={ "nose_tip_def" 205 "nose_tip_def" 205 } + face_detail_temple_def={ "temple_def" 244 "temple_def" 244 } + expression_brow_wrinkles={ "brow_wrinkles_02" 50 "brow_wrinkles_02" 50 } + expression_eye_wrinkles={ "eye_wrinkles_02" 175 "eye_wrinkles_02" 175 } + expression_forehead_wrinkles={ "forehead_wrinkles_03" 157 "forehead_wrinkles_03" 157 } + expression_other={ "cheek_wrinkles_both_01" 0 "cheek_wrinkles_both_01" 0 } + complexion={ "complexion_1" 255 "complexion_3" 168 } + gene_height={ "normal_height" 123 "normal_height" 123 } + gene_bs_body_type={ "body_fat_head_fat_full" 92 "body_fat_head_fat_full" 122 } + gene_bs_body_shape={ "body_shape_apple_half" 0 "body_shape_apple_half" 0 } + gene_bs_bust={ "bust_clothes" 204 "bust_shape_3_full" 161 } + gene_age={ "old_1" 225 "old_1" 225 } + gene_eyebrows_shape={ "far_spacing_avg_thickness" 248 "far_spacing_avg_thickness" 248 } + gene_eyebrows_fullness={ "layer_2_low_thickness" 149 "layer_2_low_thickness" 149 } + gene_body_hair={ "body_hair_avg" 95 "body_hair_avg" 95 } + gene_hair_type={ "hair_wavy" 168 "hair_wavy" 168 } + gene_baldness={ "no_baldness" 127 "no_baldness" 127 } + eye_accessory={ "normal_eyes" 18 "normal_eyes" 18 } + teeth_accessory={ "normal_teeth" 0 "normal_teeth" 0 } + eyelashes_accessory={ "normal_eyelashes" 73 "normal_eyelashes" 73 } + hairstyles={ "western_hairstyles_straight" 42 "all_hairstyles" 0 } + beards={ "no_beard" 255 "no_beard" 0 } + clothes={ "western_bedchamber" 79 "most_clothes" 0 } + } + } + enabled = yes +} +cloverskeeper_winner={ + type=male + id=0 + genes={ hair_color={ 135 152 80 76 } + skin_color={ 60 80 60 80 } + eye_color={ 233 129 172 132 } + gene_chin_forward={ "chin_forward_neg" 137 "chin_forward_neg" 124 } + gene_chin_height={ "chin_height_neg" 114 "chin_height_neg" 95 } + gene_chin_width={ "chin_width_pos" 113 "chin_width_pos" 127 } + gene_eye_angle={ "eye_angle_pos" 128 "eye_angle_pos" 128 } + gene_eye_depth={ "eye_depth_neg" 135 "eye_depth_neg" 118 } + gene_eye_height={ "eye_height_neg" 122 "eye_height_neg" 122 } + gene_eye_distance={ "eye_distance_pos" 131 "eye_distance_pos" 131 } + gene_eye_shut={ "eye_shut_pos" 145 "eye_shut_pos" 145 } + gene_forehead_angle={ "forehead_angle_neg" 136 "forehead_angle_neg" 120 } + gene_forehead_brow_height={ "forehead_brow_height_neg" 90 "forehead_brow_height_neg" 120 } + gene_forehead_roundness={ "forehead_roundness_pos" 160 "forehead_roundness_pos" 160 } + gene_forehead_width={ "forehead_width_pos" 125 "forehead_width_pos" 131 } + gene_forehead_height={ "forehead_height_pos" 151 "forehead_height_pos" 132 } + gene_head_height={ "head_height_pos" 165 "head_height_pos" 165 } + gene_head_width={ "head_width_pos" 130 "head_width_pos" 151 } + gene_head_profile={ "head_profile_pos" 166 "head_profile_pos" 166 } + gene_head_top_height={ "head_top_height_pos" 128 "head_top_height_pos" 128 } + gene_head_top_width={ "head_top_width_pos" 122 "head_top_width_pos" 127 } + gene_jaw_angle={ "jaw_angle_pos" 172 "jaw_angle_pos" 128 } + gene_jaw_forward={ "jaw_forward_neg" 105 "jaw_forward_neg" 105 } + gene_jaw_height={ "jaw_height_pos" 126 "jaw_height_pos" 139 } + gene_jaw_width={ "jaw_width_pos" 120 "jaw_width_pos" 175 } + gene_mouth_corner_depth={ "mouth_corner_depth_neg" 116 "mouth_corner_depth_neg" 116 } + gene_mouth_corner_height={ "mouth_corner_height_pos" 160 "mouth_corner_height_pos" 160 } + gene_mouth_forward={ "mouth_forward_neg" 120 "mouth_forward_neg" 120 } + gene_mouth_height={ "mouth_height_pos" 152 "mouth_height_pos" 152 } + gene_mouth_width={ "mouth_width_neg" 121 "mouth_width_neg" 121 } + gene_mouth_upper_lip_size={ "mouth_upper_lip_size_neg" 87 "mouth_upper_lip_size_neg" 87 } + gene_mouth_lower_lip_size={ "mouth_lower_lip_size_neg" 118 "mouth_lower_lip_size_neg" 99 } + gene_mouth_open={ "mouth_open_pos" 152 "mouth_open_pos" 178 } + gene_neck_length={ "neck_length_pos" 134 "neck_length_pos" 134 } + gene_neck_width={ "neck_width_pos" 137 "neck_width_pos" 137 } + gene_bs_cheek_forward={ "cheek_forward_pos" 79 "cheek_forward_pos" 37 } + gene_bs_cheek_height={ "cheek_height_pos" 79 "cheek_height_neg" 35 } + gene_bs_cheek_width={ "cheek_width_neg" 53 "cheek_width_neg" 7 } + gene_bs_ear_angle={ "ear_angle_neg" 197 "ear_angle_neg" 33 } + gene_bs_ear_inner_shape={ "ear_inner_shape_pos" 23 "ear_inner_shape_pos" 23 } + gene_bs_ear_bend={ "ear_both_bend_pos" 4 "ear_upper_bend_pos" 125 } + gene_bs_ear_outward={ "ear_outward_pos" 45 "ear_outward_pos" 34 } + gene_bs_ear_size={ "ear_size_pos" 63 "ear_size_pos" 50 } + gene_bs_eye_corner_depth={ "eye_corner_depth_pos" 51 "eye_corner_depth_pos" 213 } + gene_bs_eye_fold_shape={ "eye_fold_shape_pos" 1 "eye_fold_shape_pos" 1 } + gene_bs_eye_size={ "eye_size_pos" 53 "eye_size_pos" 28 } + gene_bs_eye_upper_lid_size={ "eye_upper_lid_size_neg" 49 "eye_upper_lid_size_pos" 8 } + gene_bs_forehead_brow_curve={ "forehead_brow_curve_neg" 118 "forehead_brow_curve_neg" 118 } + gene_bs_forehead_brow_forward={ "forehead_brow_forward_pos" 3 "forehead_brow_forward_pos" 48 } + gene_bs_forehead_brow_inner_height={ "forehead_brow_inner_height_pos" 105 "forehead_brow_inner_height_pos" 121 } + gene_bs_forehead_brow_outer_height={ "forehead_brow_outer_height_pos" 89 "forehead_brow_outer_height_pos" 120 } + gene_bs_forehead_brow_width={ "forehead_brow_width_pos" 63 "forehead_brow_width_pos" 27 } + gene_bs_jaw_def={ "jaw_def_neg" 57 "jaw_def_neg" 2 } + gene_bs_mouth_lower_lip_def={ "mouth_lower_lip_def_pos" 85 "mouth_lower_lip_def_pos" 85 } + gene_bs_mouth_lower_lip_full={ "mouth_lower_lip_full_pos" 81 "mouth_lower_lip_full_pos" 31 } + gene_bs_mouth_lower_lip_pad={ "mouth_lower_lip_pad_neg" 47 "mouth_lower_lip_pad_neg" 104 } + gene_bs_mouth_lower_lip_width={ "mouth_lower_lip_width_neg" 5 "mouth_lower_lip_width_neg" 5 } + gene_bs_mouth_philtrum_def={ "mouth_philtrum_def_pos" 27 "mouth_philtrum_def_pos" 27 } + gene_bs_mouth_philtrum_shape={ "mouth_philtrum_shape_pos" 38 "mouth_philtrum_shape_pos" 38 } + gene_bs_mouth_philtrum_width={ "mouth_philtrum_width_neg" 113 "mouth_philtrum_width_neg" 113 } + gene_bs_mouth_upper_lip_def={ "mouth_upper_lip_def_pos" 42 "mouth_upper_lip_def_pos" 42 } + gene_bs_mouth_upper_lip_full={ "mouth_upper_lip_full_pos" 97 "mouth_upper_lip_full_pos" 22 } + gene_bs_mouth_upper_lip_profile={ "mouth_upper_lip_profile_pos" 162 "mouth_upper_lip_profile_pos" 162 } + gene_bs_mouth_upper_lip_width={ "mouth_upper_lip_width_pos" 11 "mouth_upper_lip_width_pos" 11 } + gene_bs_nose_forward={ "nose_forward_pos" 31 "nose_forward_neg" 15 } + gene_bs_nose_height={ "nose_height_pos" 7 "nose_height_neg" 24 } + gene_bs_nose_length={ "nose_length_pos" 47 "nose_length_pos" 122 } + gene_bs_nose_nostril_height={ "nose_nostril_height_neg" 79 "nose_nostril_height_pos" 18 } + gene_bs_nose_nostril_width={ "nose_nostril_width_neg" 141 "nose_nostril_width_neg" 50 } + gene_bs_nose_profile={ "nose_profile_neg" 43 "nose_profile_neg" 58 } + gene_bs_nose_ridge_angle={ "nose_ridge_angle_pos" 33 "nose_ridge_angle_neg" 37 } + gene_bs_nose_ridge_width={ "nose_ridge_width_neg" 7 "nose_ridge_width_neg" 32 } + gene_bs_nose_size={ "nose_size_pos" 24 "nose_size_pos" 24 } + gene_bs_nose_tip_angle={ "nose_tip_angle_pos" 7 "nose_tip_angle_pos" 7 } + gene_bs_nose_tip_forward={ "nose_tip_forward_neg" 213 "nose_tip_forward_neg" 18 } + gene_bs_nose_tip_width={ "nose_tip_width_neg" 135 "nose_tip_width_neg" 51 } + face_detail_cheek_def={ "cheek_def_02" 173 "cheek_def_01" 10 } + face_detail_cheek_fat={ "cheek_fat_01_neg" 43 "cheek_fat_01_pos" 3 } + face_detail_chin_cleft={ "chin_cleft" 181 "chin_dimple" 13 } + face_detail_chin_def={ "chin_def_neg" 249 "chin_def_neg" 249 } + face_detail_eye_lower_lid_def={ "eye_lower_lid_def" 140 "eye_lower_lid_def" 83 } + face_detail_eye_socket={ "eye_socket_color_01" 25 "eye_socket_color_02" 25 } + face_detail_nasolabial={ "nasolabial_03" 55 "nasolabial_03" 55 } + face_detail_nose_ridge_def={ "nose_ridge_def_neg" 18 "nose_ridge_def_pos" 18 } + face_detail_nose_tip_def={ "nose_tip_def" 60 "nose_tip_def" 60 } + face_detail_temple_def={ "temple_def" 226 "temple_def" 226 } + expression_brow_wrinkles={ "brow_wrinkles_01" 33 "brow_wrinkles_01" 33 } + expression_eye_wrinkles={ "eye_wrinkles_02" 217 "eye_wrinkles_02" 217 } + expression_forehead_wrinkles={ "forehead_wrinkles_03" 172 "forehead_wrinkles_03" 172 } + expression_other={ "cheek_wrinkles_both_01" 0 "cheek_wrinkles_both_01" 0 } + complexion={ "complexion_7" 255 "complexion_5" 201 } + gene_height={ "normal_height" 126 "normal_height" 116 } + gene_bs_body_type={ "body_fat_head_fat_low" 126 "body_fat_head_fat_full" 126 } + gene_bs_body_shape={ "body_shape_hourglass_half" 51 "body_shape_hourglass_half" 0 } + gene_bs_bust={ "bust_clothes" 80 "bust_default" 111 } + gene_age={ "old_3" 123 "old_3" 123 } + gene_eyebrows_shape={ "avg_spacing_lower_thickness" 116 "avg_spacing_avg_thickness" 138 } + gene_eyebrows_fullness={ "layer_2_low_thickness" 91 "layer_2_avg_thickness" 147 } + gene_body_hair={ "body_hair_avg" 167 "body_hair_avg" 167 } + gene_hair_type={ "hair_straight" 117 "hair_straight" 117 } + gene_baldness={ "no_baldness" 127 "no_baldness" 127 } + eye_accessory={ "normal_eyes" 103 "normal_eyes" 103 } + teeth_accessory={ "normal_teeth" 0 "normal_teeth" 0 } + eyelashes_accessory={ "normal_eyelashes" 201 "normal_eyelashes" 201 } + beards={ "no_beard" 255 "no_beard" 0 } + hairstyles={ "northern_hairstyles_straight" 95 "all_hairstyles" 0 } + clothes={ "western_bedchamber" 79 "most_clothes" 0 } + } + override={ + portrait_modifier_overrides={ + custom_beards=male_empty + custom_hair=male_hair_northern_02 + } + } +  + entity={ 0 0 } +} + } +} + +"common/dna_data/00_dna_ee.txt" = { + { +2000003 = { + dna = "gIySVE1eTFw2rCWTAaAAfAGDAYMAdgGEAHoBggGkAHMAegB/AHgAbQGHAYABggGfAY0BsgGcAc8AcwGoAbABhAGYAYAAZAHMAFgBoAB2AHIBqgGLAZwBhQBzAHoBfwGAAB8BkQGGAYwAeQGLAYwAdgB2AF0BhAB/AFIBsgBmAF0AJQG3AX8BjwGBAHUALQEnAAEBcAAzAQoABQATAHIArAIWAAwAMwAiATEAMgFDAf4BFgAlARYBKgEwARAAPgEAACgALgAdAQMAPgEpAUkBLwEoASEAPQAyARsBHgA0ACEAZwACACwAEgAMAWUAKgFIACQADgAmAAgATgAVACgBeAAHACIADAEHAFAAMQENAAkBAACcAjMBYAEBAQUAAQEkAAoBMwFhARUBLQAbAG4ARgELAK0BdQAfASsAEAESAQUAIADnAAcFAAIIAZoAHAAfAPAA6wDvAJcDDAJdAKgARgAvAfMCAAIABMUBhAGKAYkBkAN4CwQIAAVkApgDEALABIgIWwR2A28BgQCgAo4BbAB/AH8AcwBzAAAAAAE2ATY=" +} +dna_marshalnsc = { + type = male + id = 0 + genes = { + hair_color={ 88 252 88 252 } + skin_color={ 222 115 222 115 } + eye_color={ 39 245 39 245 } + gene_chin_forward={ "chin_forward_neg" 71 "chin_forward_neg" 71 } + gene_chin_height={ "chin_height_pos" 140 "chin_height_pos" 140 } + gene_chin_width={ "chin_width_neg" 125 "chin_width_neg" 125 } + gene_eye_angle={ "eye_angle_pos" 138 "eye_angle_pos" 138 } + gene_eye_depth={ "eye_depth_pos" 136 "eye_depth_pos" 136 } + gene_eye_height={ "eye_height_neg" 103 "eye_height_neg" 103 } + gene_eye_distance={ "eye_distance_neg" 123 "eye_distance_neg" 123 } + gene_eye_shut={ "eye_shut_pos" 146 "eye_shut_pos" 146 } + gene_forehead_angle={ "forehead_angle_pos" 134 "forehead_angle_pos" 134 } + gene_forehead_brow_height={ "forehead_brow_height_pos" 135 "forehead_brow_height_pos" 135 } + gene_forehead_roundness={ "forehead_roundness_neg" 52 "forehead_roundness_neg" 52 } + gene_forehead_width={ "forehead_width_neg" 107 "forehead_width_neg" 107 } + gene_forehead_height={ "forehead_height_pos" 168 "forehead_height_pos" 168 } + gene_head_height={ "head_height_neg" 104 "head_height_neg" 104 } + gene_head_width={ "head_width_pos" 138 "head_width_pos" 138 } + gene_head_profile={ "head_profile_neg" 96 "head_profile_neg" 96 } + gene_head_top_height={ "head_top_height_pos" 138 "head_top_height_pos" 138 } + gene_head_top_width={ "head_top_width_pos" 142 "head_top_width_pos" 142 } + gene_jaw_angle={ "jaw_angle_neg" 118 "jaw_angle_neg" 118 } + gene_jaw_forward={ "jaw_forward_neg" 125 "jaw_forward_neg" 125 } + gene_jaw_height={ "jaw_height_pos" 152 "jaw_height_pos" 152 } + gene_jaw_width={ "jaw_width_pos" 138 "jaw_width_pos" 138 } + gene_mouth_corner_depth={ "mouth_corner_depth_pos" 135 "mouth_corner_depth_pos" 135 } + gene_mouth_corner_height={ "mouth_corner_height_neg" 120 "mouth_corner_height_neg" 120 } + gene_mouth_forward={ "mouth_forward_neg" 124 "mouth_forward_neg" 124 } + gene_mouth_height={ "mouth_height_neg" 124 "mouth_height_neg" 124 } + gene_mouth_width={ "mouth_width_neg" 41 "mouth_width_neg" 41 } + gene_mouth_upper_lip_size={ "mouth_upper_lip_size_neg" 126 "mouth_upper_lip_size_neg" 126 } + gene_mouth_lower_lip_size={ "mouth_lower_lip_size_neg" 119 "mouth_lower_lip_size_neg" 119 } + gene_mouth_open={ "mouth_open_neg" 96 "mouth_open_neg" 96 } + gene_neck_length={ "neck_length_pos" 128 "neck_length_pos" 128 } + gene_neck_width={ "neck_width_neg" 113 "neck_width_neg" 113 } + gene_bs_cheek_forward={ "cheek_forward_pos" 14 "cheek_forward_pos" 14 } + gene_bs_cheek_height={ "cheek_height_pos" 47 "cheek_height_pos" 47 } + gene_bs_cheek_width={ "cheek_width_neg" 21 "cheek_width_neg" 21 } + gene_bs_ear_angle={ "ear_angle_pos" 122 "ear_angle_pos" 122 } + gene_bs_ear_inner_shape={ "ear_inner_shape_pos" 38 "ear_inner_shape_pos" 38 } + gene_bs_ear_bend={ "ear_both_bend_pos" 6 "ear_both_bend_pos" 6 } + gene_bs_ear_outward={ "ear_outward_neg" 29 "ear_outward_neg" 29 } + gene_bs_ear_size={ "ear_size_pos" 40 "ear_size_pos" 40 } + gene_bs_eye_corner_depth={ "eye_corner_depth_neg" 194 "eye_corner_depth_neg" 194 } + gene_bs_eye_fold_shape={ "eye_fold_shape_pos" 32 "eye_fold_shape_pos" 32 } + gene_bs_eye_size={ "eye_size_pos" 44 "eye_size_pos" 44 } + gene_bs_eye_upper_lid_size={ "eye_upper_lid_size_neg" 217 "eye_upper_lid_size_neg" 217 } + gene_bs_forehead_brow_curve={ "forehead_brow_curve_neg" 16 "forehead_brow_curve_neg" 16 } + gene_bs_forehead_brow_forward={ "forehead_brow_forward_neg" 49 "forehead_brow_forward_neg" 49 } + gene_bs_forehead_brow_inner_height={ "forehead_brow_inner_height_pos" 14 "forehead_brow_inner_height_pos" 14 } + gene_bs_forehead_brow_outer_height={ "forehead_brow_outer_height_pos" 116 "forehead_brow_outer_height_pos" 116 } + gene_bs_forehead_brow_width={ "forehead_brow_width_neg" 16 "forehead_brow_width_neg" 16 } + gene_bs_jaw_def={ "jaw_def_neg" 195 "jaw_def_neg" 195 } + gene_bs_mouth_lower_lip_def={ "mouth_lower_lip_def_pos" 87 "mouth_lower_lip_def_pos" 87 } + gene_bs_mouth_lower_lip_full={ "mouth_lower_lip_full_pos" 14 "mouth_lower_lip_full_pos" 14 } + gene_bs_mouth_lower_lip_pad={ "mouth_lower_lip_pad_neg" 4 "mouth_lower_lip_pad_neg" 4 } + gene_bs_mouth_lower_lip_width={ "mouth_lower_lip_width_neg" 6 "mouth_lower_lip_width_neg" 6 } + gene_bs_mouth_philtrum_def={ "mouth_philtrum_def_pos" 15 "mouth_philtrum_def_pos" 15 } + gene_bs_mouth_philtrum_shape={ "mouth_philtrum_shape_pos" 34 "mouth_philtrum_shape_pos" 34 } + gene_bs_mouth_philtrum_width={ "mouth_philtrum_width_neg" 47 "mouth_philtrum_width_neg" 47 } + gene_bs_mouth_upper_lip_def={ "mouth_upper_lip_def_pos" 114 "mouth_upper_lip_def_pos" 114 } + gene_bs_mouth_upper_lip_full={ "mouth_upper_lip_full_pos" 32 "mouth_upper_lip_full_pos" 32 } + gene_bs_mouth_upper_lip_profile={ "mouth_upper_lip_profile_neg" 11 "mouth_upper_lip_profile_neg" 11 } + gene_bs_mouth_upper_lip_width={ "mouth_upper_lip_width_neg" 15 "mouth_upper_lip_width_neg" 15 } + gene_bs_nose_forward={ "nose_forward_pos" 22 "nose_forward_pos" 22 } + gene_bs_nose_height={ "nose_height_pos" 72 "nose_height_pos" 72 } + gene_bs_nose_length={ "nose_length_neg" 79 "nose_length_neg" 79 } + gene_bs_nose_nostril_height={ "nose_nostril_height_pos" 11 "nose_nostril_height_pos" 11 } + gene_bs_nose_nostril_width={ "nose_nostril_width_neg" 79 "nose_nostril_width_neg" 79 } + gene_bs_nose_profile={ "nose_profile_pos" 33 "nose_profile_pos" 33 } + gene_bs_nose_ridge_angle={ "nose_ridge_angle_pos" 10 "nose_ridge_angle_pos" 10 } + gene_bs_nose_ridge_width={ "nose_ridge_width_pos" 48 "nose_ridge_width_pos" 48 } + gene_bs_nose_size={ "nose_size_pos" 59 "nose_size_pos" 59 } + gene_bs_nose_tip_angle={ "nose_tip_angle_neg" 27 "nose_tip_angle_neg" 27 } + gene_bs_nose_tip_forward={ "nose_tip_forward_neg" 175 "nose_tip_forward_neg" 175 } + gene_bs_nose_tip_width={ "nose_tip_width_neg" 8 "nose_tip_width_neg" 8 } + face_detail_cheek_def={ "cheek_def_01" 74 "cheek_def_01" 74 } + face_detail_cheek_fat={ "cheek_fat_01_pos" 152 "cheek_fat_01_pos" 152 } + face_detail_chin_cleft={ "chin_cleft" 22 "chin_cleft" 22 } + face_detail_chin_def={ "chin_def_neg" 55 "chin_def_neg" 55 } + face_detail_eye_lower_lid_def={ "eye_lower_lid_def" 107 "eye_lower_lid_def" 107 } + face_detail_eye_socket={ "eye_socket_03" 6 "eye_socket_03" 6 } + face_detail_nasolabial={ "nasolabial_01" 11 "nasolabial_01" 11 } + face_detail_nose_ridge_def={ "nose_ridge_def_neg" 12 "nose_ridge_def_neg" 12 } + face_detail_nose_tip_def={ "nose_tip_def" 20 "nose_tip_def" 20 } + face_detail_temple_def={ "temple_def" 0 "temple_def" 0 } + expression_brow_wrinkles={ "brow_wrinkles_03" 13 "brow_wrinkles_03" 13 } + expression_eye_wrinkles={ "eye_wrinkles_01" 32 "eye_wrinkles_01" 32 } + expression_forehead_wrinkles={ "forehead_wrinkles_02" 150 "forehead_wrinkles_02" 150 } + expression_other={ "cheek_wrinkles_both_01" 0 "cheek_wrinkles_both_01" 0 } + complexion={ "complexion_2" 137 "complexion_2" 137 } + gene_height={ "normal_height" 126 "normal_height" 126 } + gene_bs_body_type={ "body_fat_head_fat_medium" 134 "body_fat_head_fat_medium" 134 } + gene_bs_body_shape={ "body_shape_rectangle_full" 70 "body_shape_rectangle_full" 19 } + gene_bs_bust={ "bust_clothes" 9 "bust_shape_1_half" 12 } + gene_age={ "old_2" 12 "old_2" 12 } + gene_eyebrows_shape={ "far_spacing_low_thickness" 240 "far_spacing_low_thickness" 240 } + gene_eyebrows_fullness={ "layer_2_low_thickness" 234 "layer_2_low_thickness" 234 } + gene_body_hair={ "body_hair_sparse_low_stubble" 7 "body_hair_sparse_low_stubble" 7 } + gene_hair_type={ "hair_straight_thin_beard" 190 "hair_straight_thin_beard" 190 } + gene_baldness={ "male_pattern_baldness" 239 "male_pattern_baldness" 168 } + eye_accessory={ "normal_eyes" 131 "normal_eyes" 131 } + teeth_accessory={ "normal_teeth" 0 "normal_teeth" 0 } + eyelashes_accessory={ "normal_eyelashes" 207 "normal_eyelashes" 207 } + hairstyles={ "male_hair_fp1_07" 190 "all_hairstyles" 0 } + beards={ "no_beard" 255 "no_beard" 0 } + clothes={ "western_bedchamber" 79 "most_clothes" 0 } + } + + override = { + portrait_modifier_overrides = { + custom_hair = male_hair_fp1_07 + custom_beards = male_empty + } + } + + entity = { 0 0 } +} + +dna_tazon = { + portrait_info = { + genes = { + hair_color={ 147 249 225 211 } + skin_color={ 56 73 150 107 } + eye_color={ 51 179 17 164 } + gene_chin_forward={ "chin_forward_pos" 143 "chin_forward_pos" 141 } + gene_chin_height={ "chin_height_pos" 149 "chin_height_pos" 153 } + gene_chin_width={ "chin_width_pos" 137 "chin_width_pos" 136 } + gene_eye_angle={ "eye_angle_pos" 82 "eye_angle_pos" 155 } + gene_eye_depth={ "eye_depth_neg" 168 "eye_depth_neg" 123 } + gene_eye_height={ "eye_height_neg" 188 "eye_height_neg" 115 } + gene_eye_distance={ "eye_distance_neg" 150 "eye_distance_neg" 125 } + gene_eye_shut={ "eye_shut_pos" 118 "eye_shut_pos" 134 } + gene_forehead_angle={ "forehead_angle_pos" 143 "forehead_angle_pos" 165 } + gene_forehead_brow_height={ "forehead_brow_height_pos" 114 "forehead_brow_height_pos" 163 } + gene_forehead_roundness={ "forehead_roundness_neg" 162 "forehead_roundness_neg" 117 } + gene_forehead_width={ "forehead_width_pos" 148 "forehead_width_pos" 131 } + gene_forehead_height={ "forehead_height_pos" 144 "forehead_height_pos" 128 } + gene_head_height={ "head_height_neg" 156 "head_height_neg" 108 } + gene_head_width={ "head_width_pos" 97 "head_width_pos" 225 } + gene_head_profile={ "head_profile_neg" 102 "head_profile_neg" 92 } + gene_head_top_height={ "head_top_height_pos" 155 "head_top_height_pos" 157 } + gene_head_top_width={ "head_top_width_pos" 131 "head_top_width_pos" 166 } + gene_jaw_angle={ "jaw_angle_pos" 89 "jaw_angle_pos" 131 } + gene_jaw_forward={ "jaw_forward_pos" 126 "jaw_forward_pos" 139 } + gene_jaw_height={ "jaw_height_neg" 108 "jaw_height_neg" 126 } + gene_jaw_width={ "jaw_width_pos" 136 "jaw_width_pos" 144 } + gene_mouth_corner_depth={ "mouth_corner_depth_pos" 82 "mouth_corner_depth_pos" 127 } + gene_mouth_corner_height={ "mouth_corner_height_pos" 120 "mouth_corner_height_pos" 160 } + gene_mouth_forward={ "mouth_forward_pos" 134 "mouth_forward_pos" 134 } + gene_mouth_height={ "mouth_height_pos" 203 "mouth_height_pos" 138 } + gene_mouth_width={ "mouth_width_pos" 115 "mouth_width_pos" 136 } + gene_mouth_upper_lip_size={ "mouth_upper_lip_size_neg" 121 "mouth_upper_lip_size_neg" 107 } + gene_mouth_lower_lip_size={ "mouth_lower_lip_size_neg" 143 "mouth_lower_lip_size_neg" 117 } + gene_mouth_open={ "mouth_open_neg" 1 "mouth_open_neg" 13 } + gene_neck_length={ "neck_length_neg" 121 "neck_length_neg" 109 } + gene_neck_width={ "neck_width_pos" 120 "neck_width_pos" 144 } + gene_bs_cheek_forward={ "cheek_forward_pos" 17 "cheek_forward_pos" 7 } + gene_bs_cheek_height={ "cheek_height_pos" 55 "cheek_height_pos" 32 } + gene_bs_cheek_width={ "cheek_width_neg" 21 "cheek_width_neg" 7 } + gene_bs_ear_angle={ "ear_angle_pos" 57 "ear_angle_pos" 41 } + gene_bs_ear_inner_shape={ "ear_inner_shape_pos" 22 "ear_inner_shape_pos" 22 } + gene_bs_ear_bend={ "ear_lower_bend_pos" 102 "ear_both_bend_pos" 44 } + gene_bs_ear_outward={ "ear_outward_neg" 99 "ear_outward_pos" 20 } + gene_bs_ear_size={ "ear_size_pos" 9 "ear_size_pos" 33 } + gene_bs_eye_corner_depth={ "eye_corner_depth_pos" 109 "eye_corner_depth_pos" 230 } + gene_bs_eye_fold_shape={ "eye_fold_shape_neg" 33 "eye_fold_shape_pos" 29 } + gene_bs_eye_size={ "eye_size_pos" 59 "eye_size_neg" 26 } + gene_bs_eye_upper_lid_size={ "eye_upper_lid_size_pos" 127 "eye_upper_lid_size_neg" 7 } + gene_bs_forehead_brow_curve={ "forehead_brow_curve_pos" 13 "forehead_brow_curve_neg" 108 } + gene_bs_forehead_brow_forward={ "forehead_brow_forward_pos" 109 "forehead_brow_forward_pos" 38 } + gene_bs_forehead_brow_inner_height={ "forehead_brow_inner_height_pos" 67 "forehead_brow_inner_height_pos" 121 } + gene_bs_forehead_brow_outer_height={ "forehead_brow_outer_height_neg" 41 "forehead_brow_outer_height_pos" 44 } + gene_bs_forehead_brow_width={ "forehead_brow_width_neg" 39 "forehead_brow_width_neg" 45 } + gene_bs_jaw_def={ "jaw_def_neg" 15 "jaw_def_neg" 51 } + gene_bs_mouth_lower_lip_def={ "mouth_lower_lip_def_pos" 127 "mouth_lower_lip_def_pos" 123 } + gene_bs_mouth_lower_lip_full={ "mouth_lower_lip_full_neg" 75 "mouth_lower_lip_full_neg" 83 } + gene_bs_mouth_lower_lip_pad={ "mouth_lower_lip_pad_neg" 39 "mouth_lower_lip_pad_pos" 23 } + gene_bs_mouth_lower_lip_width={ "mouth_lower_lip_width_neg" 59 "mouth_lower_lip_width_neg" 32 } + gene_bs_mouth_philtrum_def={ "mouth_philtrum_def_pos" 89 "mouth_philtrum_def_pos" 50 } + gene_bs_mouth_philtrum_shape={ "mouth_philtrum_shape_pos" 19 "mouth_philtrum_shape_neg" 1 } + gene_bs_mouth_philtrum_width={ "mouth_philtrum_width_pos" 109 "mouth_philtrum_width_neg" 195 } + gene_bs_mouth_upper_lip_def={ "mouth_upper_lip_def_pos" 127 "mouth_upper_lip_def_pos" 34 } + gene_bs_mouth_upper_lip_full={ "mouth_upper_lip_full_pos" 27 "mouth_upper_lip_full_neg" 3 } + gene_bs_mouth_upper_lip_profile={ "mouth_upper_lip_profile_neg" 47 "mouth_upper_lip_profile_pos" 64 } + gene_bs_mouth_upper_lip_width={ "mouth_upper_lip_width_neg" 43 "mouth_upper_lip_width_pos" 67 } + gene_bs_nose_forward={ "nose_forward_neg" 37 "nose_forward_neg" 20 } + gene_bs_nose_height={ "nose_height_pos" 79 "nose_height_pos" 77 } + gene_bs_nose_length={ "nose_length_pos" 27 "nose_length_pos" 46 } + gene_bs_nose_nostril_height={ "nose_nostril_height_pos" 21 "nose_nostril_height_pos" 125 } + gene_bs_nose_nostril_width={ "nose_nostril_width_neg" 27 "nose_nostril_width_neg" 47 } + gene_bs_nose_profile={ "nose_profile_pos" 31 "nose_profile_pos" 18 } + gene_bs_nose_ridge_angle={ "nose_ridge_angle_neg" 9 "nose_ridge_angle_neg" 10 } + gene_bs_nose_ridge_width={ "nose_ridge_width_pos" 109 "nose_ridge_width_pos" 32 } + gene_bs_nose_size={ "nose_size_neg" 13 "nose_size_neg" 29 } + gene_bs_nose_tip_angle={ "nose_tip_angle_neg" 3 "nose_tip_angle_pos" 39 } + gene_bs_nose_tip_forward={ "nose_tip_forward_pos" 5 "nose_tip_forward_neg" 19 } + gene_bs_nose_tip_width={ "nose_tip_width_neg" 1 "nose_tip_width_pos" 103 } + face_detail_cheek_def={ "cheek_def_01" 47 "cheek_def_02" 56 } + face_detail_cheek_fat={ "cheek_fat_02_pos" 64 "cheek_fat_01_pos" 25 } + face_detail_chin_cleft={ "chin_cleft" 4 "chin_cleft" 18 } + face_detail_chin_def={ "chin_def_neg" 63 "chin_def" 5 } + face_detail_eye_lower_lid_def={ "eye_lower_lid_def" 176 "eye_lower_lid_def" 233 } + face_detail_eye_socket={ "eye_socket_color_01" 150 "eye_socket_color_01" 208 } + face_detail_nasolabial={ "nasolabial_03" 21 "nasolabial_03" 21 } + face_detail_nose_ridge_def={ "nose_ridge_def_neg" 0 "nose_ridge_def_pos" 194 } + face_detail_nose_tip_def={ "nose_tip_def" 30 "nose_tip_def" 74 } + face_detail_temple_def={ "temple_def" 33 "temple_def" 140 } + expression_brow_wrinkles={ "brow_wrinkles_04" 35 "brow_wrinkles_04" 35 } + expression_eye_wrinkles={ "eye_wrinkles_01" 70 "eye_wrinkles_01" 70 } + expression_forehead_wrinkles={ "forehead_wrinkles_01" 90 "forehead_wrinkles_01" 90 } + expression_other={ "cheek_wrinkles_both_01" 0 "cheek_wrinkles_both_01" 0 } + complexion={ "complexion_1" 209 "complexion_2" 129 } + gene_height={ "normal_height" 122 "normal_height" 127 } + gene_bs_body_type={ "body_fat_head_fat_low" 116 "body_fat_head_fat_low" 116 } + gene_bs_body_shape={ "body_shape_hourglass_half" 0 "body_shape_hourglass_half" 0 } + gene_bs_bust={ "bust_clothes" 31 "bust_shape_3_full" 154 } + gene_age={ "old_3" 80 "old_3" 80 } + gene_eyebrows_shape={ "avg_spacing_low_thickness" 143 "far_spacing_low_thickness" 235 } + gene_eyebrows_fullness={ "layer_2_avg_thickness" 151 "layer_2_low_thickness" 174 } + gene_body_hair={ "body_hair_avg" 129 "body_hair_avg" 129 } + gene_hair_type={ "hair_straight" 158 "hair_straight" 158 } + gene_baldness={ "male_pattern_baldness" 94 "male_pattern_baldness" 94 } + eye_accessory={ "normal_eyes" 218 "normal_eyes" 218 } + teeth_accessory={ "normal_teeth" 0 "normal_teeth" 0 } + eyelashes_accessory={ "normal_eyelashes" 204 "normal_eyelashes" 204 } + beards={ "western_beards_straight" 255 "no_beard" 0 } + hairstyles={ "western_hairstyles_straight" 231 "all_hairstyles" 0 } + } + } + enabled=yes +} + } } \ No newline at end of file