Skip to main content

rpfm_lib/games/
supported_games.rs

1//---------------------------------------------------------------------------//
2// Copyright (c) 2017-2026 Ismael Gutiérrez González. All rights reserved.
3//
4// This file is part of the Rusted PackFile Manager (RPFM) project,
5// which can be found here: https://github.com/Frodo45127/rpfm.
6//
7// This file is licensed under the MIT license, which can be found here:
8// https://github.com/Frodo45127/rpfm/blob/master/LICENSE.
9//---------------------------------------------------------------------------//
10
11//! Registry of all Total War games supported by RPFM.
12//!
13//! This module contains the complete list of supported Total War games with their
14//! full configuration data. It provides the [`SupportedGames`] registry which allows
15//! lookup of game information by key.
16//!
17//! # Supported Games
18//!
19//! RPFM currently supports these Total War games (newest to oldest):
20//! - Shogun 2 Complete Edition (2026)
21//! - Pharaoh Dynasties (2024)
22//! - Pharaoh (2023)
23//! - Warhammer 3 (2022)
24//! - Troy (2020)
25//! - Three Kingdoms (2019)
26//! - Warhammer 2 (2017)
27//! - Warhammer (2016)
28//! - Thrones of Britannia (2018)
29//! - Attila (2015)
30//! - Rome 2 (2013)
31//! - Shogun 2 (2011)
32//! - Napoleon (2010)
33//! - Empire (2009)
34//! - Arena (online game)
35//!
36//! # Usage
37//!
38//! The primary way to access game information is through the [`SupportedGames`] registry:
39//!
40//! ```ignore
41//! use rpfm_lib::games::supported_games::{SupportedGames, KEY_WARHAMMER_3};
42//!
43//! let games = SupportedGames::default();
44//! let wh3 = games.game(&KEY_WARHAMMER_3).unwrap();
45//! println!("Game: {}", wh3.display_name());
46//! ```
47//!
48//! # Game Keys
49//!
50//! Each game has a unique key constant (e.g., [`KEY_WARHAMMER_3`]) used for programmatic
51//! lookup. These keys are also used in directory names and configuration files.
52//!
53//! # Adding New Games
54//!
55//! To add support for a new Total War game:
56//! 1. Add display name and key constants
57//! 2. Create a [`GameInfo`] instance in the [`SupportedGames::default()`] implementation
58//! 3. Add the game to the `order` vector for proper release order sorting
59//! 4. Update relevant tests
60
61use std::collections::HashMap;
62use std::sync::{Arc, RwLock};
63
64use crate::compression::CompressionFormat;
65use super::{GameInfo, InstallData, InstallType, pfh_file_type::PFHFileType, pfh_version::PFHVersion, VanillaDBTableNameLogic};
66
67//---------------------------------------------------------------------------//
68// Display names for all supported Total War games.
69//
70// These are user-facing strings used in UI elements, error messages, and logs.
71// They represent the official or commonly-used short names for each game.
72//---------------------------------------------------------------------------//
73
74/// Display name for Total War: Shogun 2 Complete Edition.
75pub const DISPLAY_NAME_SHOGUN_2_COMPLETE_EDITION: &str = "Shogun 2 Complete Edition";
76
77/// Display name for Total War: Pharaoh Dynasties.
78pub const DISPLAY_NAME_PHARAOH_DYNASTIES: &str = "Pharaoh Dynasties";
79
80/// Display name for Total War: Pharaoh.
81pub const DISPLAY_NAME_PHARAOH: &str = "Pharaoh";
82
83/// Display name for Total War: Warhammer III.
84pub const DISPLAY_NAME_WARHAMMER_3: &str = "Warhammer 3";
85
86/// Display name for A Total War Saga: Troy.
87pub const DISPLAY_NAME_TROY: &str = "Troy";
88
89/// Display name for Total War: Three Kingdoms.
90pub const DISPLAY_NAME_THREE_KINGDOMS: &str = "Three Kingdoms";
91
92/// Display name for Total War: Warhammer II.
93pub const DISPLAY_NAME_WARHAMMER_2: &str = "Warhammer 2";
94
95/// Display name for Total War: Warhammer.
96pub const DISPLAY_NAME_WARHAMMER: &str = "Warhammer";
97
98/// Display name for A Total War Saga: Thrones of Britannia.
99pub const DISPLAY_NAME_THRONES_OF_BRITANNIA: &str = "Thrones of Britannia";
100
101/// Display name for Total War: Attila.
102pub const DISPLAY_NAME_ATTILA: &str = "Attila";
103
104/// Display name for Total War: Rome II.
105pub const DISPLAY_NAME_ROME_2: &str = "Rome 2";
106
107/// Display name for Total War: Shogun 2.
108pub const DISPLAY_NAME_SHOGUN_2: &str = "Shogun 2";
109
110/// Display name for Napoleon: Total War.
111pub const DISPLAY_NAME_NAPOLEON: &str = "Napoleon";
112
113/// Display name for Empire: Total War.
114pub const DISPLAY_NAME_EMPIRE: &str = "Empire";
115
116/// Display name for Total War: Arena.
117pub const DISPLAY_NAME_ARENA: &str = "Arena";
118
119//---------------------------------------------------------------------------//
120// Unique identifier keys for all supported Total War games.
121//
122// These lowercase, underscore-separated strings are used internally as stable
123// identifiers for games throughout RPFM. They're used in:
124// - Configuration file paths
125// - Schema file organization
126// - Game detection and selection
127// - Save file organization
128//
129// Schema status notes:
130// - "Filtered and revised": Assembly Kit fields have been manually reviewed and corrected
131// - "Startpos tables done": Campaign start position tables have been successfully decoded
132// - "Pending": Schema review and/or startpos decoding still needed
133//---------------------------------------------------------------------------//
134
135/// Unique key for Total War: Shogun 2 Complete Edition.
136pub const KEY_SHOGUN_2_COMPLETE_EDITION: &str = "shogun_2_complete_edition"; // Pending of schema review for incorrect AK fields. Pending decoding starpos tables.
137
138/// Unique key for Total War: Pharaoh Dynasties.
139pub const KEY_PHARAOH_DYNASTIES: &str = "pharaoh_dynasties";        // Filtered and revised incorrect AK fields. Startpos tables done.
140
141/// Unique key for Total War: Pharaoh.
142pub const KEY_PHARAOH: &str = "pharaoh";                            // Filtered and revised incorrect AK fields. Startpos tables done.
143
144/// Unique key for Total War: Warhammer III.
145pub const KEY_WARHAMMER_3: &str = "warhammer_3";                    // Filtered and revised incorrect AK fields. Startpos tables done.
146
147/// Unique key for A Total War Saga: Troy.
148pub const KEY_TROY: &str = "troy";                                  // Filtered and revised incorrect AK fields. Startpos tables done.
149
150/// Unique key for Total War: Three Kingdoms.
151pub const KEY_THREE_KINGDOMS: &str = "three_kingdoms";              // Filtered and revised incorrect AK fields. Startpos tables done.
152
153/// Unique key for Total War: Warhammer II.
154pub const KEY_WARHAMMER_2: &str = "warhammer_2";                    // Filtered and revised incorrect AK fields. Startpos tables done.
155
156/// Unique key for Total War: Warhammer.
157pub const KEY_WARHAMMER: &str = "warhammer";                        // Filtered and revised incorrect AK fields. Startpos tables done.
158
159/// Unique key for A Total War Saga: Thrones of Britannia.
160pub const KEY_THRONES_OF_BRITANNIA: &str = "thrones_of_britannia";  // Filtered and revised incorrect AK fields. Startpos tables done.
161
162/// Unique key for Total War: Attila.
163pub const KEY_ATTILA: &str = "attila";                              // Filtered and revised incorrect AK fields. Startpos tables done.
164
165/// Unique key for Total War: Rome II.
166pub const KEY_ROME_2: &str = "rome_2";                              // Filtered and revised incorrect AK fields. Startpos tables done.
167
168/// Unique key for Total War: Shogun 2.
169pub const KEY_SHOGUN_2: &str = "shogun_2";                          // Filtered and revised incorrect AK fields. Startpos tables done.
170
171/// Unique key for Napoleon: Total War.
172pub const KEY_NAPOLEON: &str = "napoleon";                          // Pending of schema review for incorrect AK fields. Pending decoding starpos tables.
173
174/// Unique key for Empire: Total War.
175pub const KEY_EMPIRE: &str = "empire";                              // Pending of schema review for incorrect AK fields. Pending decoding starpos tables.
176
177/// Unique key for Total War: Arena.
178pub const KEY_ARENA: &str = "arena";
179
180//-------------------------------------------------------------------------------//
181//                              Enums & Structs
182//-------------------------------------------------------------------------------//
183
184/// Registry of all supported Total War games.
185///
186/// This struct maintains the complete list of games supported by RPFM along with
187/// their full configuration. It provides lookup by game key and maintains release
188/// order for UI sorting.
189///
190/// # Structure
191///
192/// - `games`: HashMap for O(1) lookup by game key
193/// - `order`: Vector maintaining games in release order (newest first)
194///
195/// # Usage
196///
197/// Create via [`Default::default()`] to get the full game registry:
198///
199/// ```ignore
200/// use rpfm_lib::games::supported_games::{SupportedGames, KEY_WARHAMMER_3};
201///
202/// let games = SupportedGames::default();
203///
204/// // Lookup specific game
205/// if let Some(game) = games.game(&KEY_WARHAMMER_3) {
206///     println!("{}", game.display_name());
207/// }
208///
209/// // Iterate all games in release order
210/// for game in games.games_sorted() {
211///     println!("{}", game.display_name());
212/// }
213/// ```
214pub struct SupportedGames {
215
216    /// Map of game key to full game configuration.
217    ///
218    /// Keys are string constants like [`KEY_WARHAMMER_3`].
219    games: HashMap<&'static str, GameInfo>,
220
221    /// Games in release order (newest first).
222    ///
223    /// Maintains the order games should appear in UI dropdowns.
224    order: Vec<&'static str>
225}
226
227//-------------------------------------------------------------------------------//
228//                             Implementations
229//-------------------------------------------------------------------------------//
230
231impl Default for SupportedGames {
232    fn default() -> Self {
233        let mut game_list = HashMap::new();
234
235        // Shogun 2 Complete Edition
236        game_list.insert(KEY_SHOGUN_2_COMPLETE_EDITION, GameInfo {
237            key: KEY_SHOGUN_2_COMPLETE_EDITION,
238            display_name: DISPLAY_NAME_SHOGUN_2_COMPLETE_EDITION,
239            pfh_versions: {
240                let mut data = HashMap::new();
241                data.insert(PFHFileType::Boot, PFHVersion::PFH3);
242                data.insert(PFHFileType::Release, PFHVersion::PFH3);
243                data.insert(PFHFileType::Patch, PFHVersion::PFH3);
244                data.insert(PFHFileType::Mod, PFHVersion::PFH3);
245                data.insert(PFHFileType::Movie, PFHVersion::PFH3);
246                data
247            },
248            schema_file_name: "schema_sho2_ce.ron".to_owned(),
249            dependencies_cache_file_name: "sho2ce.pak2".to_owned(),
250            raw_db_version: 1,
251            portrait_settings_version: None,
252            supports_editing: true,
253            db_tables_have_guid: true,
254            locale_file_name: Some("language.txt".to_owned()),
255            banned_packedfiles: vec![],
256            icon_small: "gs_sho2_ce.png".to_owned(),
257            icon_big: "gs_big_sho2_ce.png".to_owned(),
258            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
259            install_data: {
260                let mut data = HashMap::new();
261                data.insert(InstallType::WinSteam, InstallData {
262                    vanilla_packs: vec![],
263                    use_manifest: true,
264                    store_id: 3_846_830,
265                    store_id_ak: 202_930,
266                    executable: "shogun2_complete_edition.exe".to_owned(),
267                    data_path: "data".to_owned(),
268                    language_path: "data".to_owned(),
269                    local_mods_path: "data".to_owned(),
270                    downloaded_mods_path: "".to_owned(),
271                    config_folder: Some("Shogun2CompleteEdition".to_owned())
272                });
273
274                data
275            },
276            tool_vars: HashMap::new(),
277            lua_autogen_folder: None,
278            ak_lost_fields: vec![
279                "_kv_experience_bonuses/description".to_owned(),
280                "_kv_fatigue/description".to_owned(),
281                "_kv_key_buildings/description".to_owned(),
282                "_kv_morale/description".to_owned(),
283                "_kv_naval_morale/description".to_owned(),
284                "_kv_rules/description".to_owned(),
285                "_kv_special_ability_effects/description".to_owned(),
286                "agents/animation_set".to_owned(),
287                "agents/associated_unit".to_owned(),
288                "agents/in_encyclopedia".to_owned(),
289
290                // Possible loc incorrectly marked.
291                "ancillaries/effect_text".to_owned(),
292
293                "ancillary_info/author".to_owned(),
294                "ancillary_info/comment".to_owned(),
295                "ancillary_info/historical_example".to_owned(),
296
297                "avatar_dojos/codependency_key".to_owned(),
298                "avatar_gempei_dojos/codependency_key".to_owned(),
299                "avatar_ranks/avatar_naval_unit_cost".to_owned(),
300                "avatar_unit_group_ids/description".to_owned(),
301                "avatar_units/anti_spam_cost_increase".to_owned(),
302                "avatar_units/anti_spam_limit".to_owned(),
303                "battle_script_strings/game_area".to_owned(),
304                "battlefield_building_transformations/description".to_owned(),
305
306                // Special case. These exist, but due to the game having fragments of this table
307                // with old version that don't have these columns, they get reported as missing.
308                "battlefield_buildings/fortwall_penetration_chance".to_owned(),
309                "battlefield_buildings/radar_icon".to_owned(),
310                "battlefield_buildings/spawned_unit".to_owned(),
311                "battlefield_buildings/visible_in_public_ted".to_owned(),
312
313                "battles/objectives_team_1".to_owned(),
314                "battles/objectives_team_2".to_owned(),
315                "building_levels/building_category".to_owned(),
316                "campaign_ai_managers/description".to_owned(),
317                "campaign_ai_personalities/description".to_owned(),
318                "campaign_map_playable_areas/mapname".to_owned(),
319                "campaign_map_playable_areas/maxx".to_owned(),
320                "campaign_map_playable_areas/maxy".to_owned(),
321                "campaign_map_playable_areas/minx".to_owned(),
322                "campaign_map_playable_areas/miny".to_owned(),
323                "campaign_map_towns_and_ports/region".to_owned(),
324                "campaign_variables/description".to_owned(),
325                "campaigns/data_directory".to_owned(),
326                "character_trait_levels/effect_text".to_owned(),
327                "character_traits/author".to_owned(),
328                "character_traits/comment".to_owned(),
329                "event_log_descriptions/notes".to_owned(),
330                "experience_triggers/condition".to_owned(),
331                "experience_triggers/event".to_owned(),
332
333                // Possible loc, doesn't exist in the ak.
334                "incident_heading_texts/localised_heading_text".to_owned(),
335
336                "mount_variants/key".to_owned(),
337                "multiplayer_mininum_length_funds/description".to_owned(),
338                "projectiles/bounce_angle".to_owned(),
339                "projectiles/preflight_rules".to_owned(),
340                "projectiles_explosions/non_lethal_detonation".to_owned(),
341                "regions/in_encyclopedia".to_owned(),
342                "regions/palette_entry".to_owned(),
343                "slots_art/underlay_rotation".to_owned(),
344                "slots_art/underlay_scale".to_owned(),
345                "start_pos_diplomacy/relations_modifier".to_owned(),
346                "start_pos_forts/fort_name".to_owned(),
347                "start_pos_regions/encyclopedia_order".to_owned(),
348                "technologies/in_encyclopedia".to_owned(),
349                "trigger_events/from_ui".to_owned(),
350                "uniforms/IconScreenshotCameraPreset".to_owned(),
351                "uniforms/InfoScreenshotCameraPreset".to_owned(),
352                "uniforms/ManAnimation".to_owned(),
353                "uniforms/MountAnimation".to_owned(),
354                "unit_stats_land/desert_effect".to_owned(),
355                "unit_stats_land/snow_effect".to_owned(),
356                "unit_stats_land/tropics_effect".to_owned(),
357                "unit_stats_land/unit_class".to_owned(),
358                "unit_stats_naval/repair_cost_port".to_owned(),
359                "unit_stats_naval/repair_cost_sea".to_owned(),
360                "unit_stats_naval/ship_rating_icon".to_owned(),
361                "units/era".to_owned(),
362                "units/fitness".to_owned(),
363                "units/pdlc".to_owned(),
364                "warscape_underlay_textures/height".to_owned(),
365                "warscape_underlay_textures/orientation-angle".to_owned(),
366                "warscape_underlay_textures/width".to_owned(),
367            ],
368            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
369            compression_formats_supported: vec![
370                CompressionFormat::Lz4Block
371            ],
372            max_cs2_parsed_version: 0
373        });
374
375        // Pharaoh/Dynasties. This is really the same as pharaoh, but CA re-released as a separate game, so we treat it as a separate game too.
376        game_list.insert(KEY_PHARAOH_DYNASTIES, GameInfo {
377            key: KEY_PHARAOH_DYNASTIES,
378            display_name: DISPLAY_NAME_PHARAOH_DYNASTIES,
379            pfh_versions: {
380                let mut data = HashMap::new();
381                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
382                data.insert(PFHFileType::Release, PFHVersion::PFH5);
383                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
384                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
385                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
386                data
387            },
388            schema_file_name: "schema_ph_dyn.ron".to_owned(),
389            dependencies_cache_file_name: "ph_dyn.pak2".to_owned(),
390            raw_db_version: 2,
391            portrait_settings_version: None,
392            supports_editing: true,
393            db_tables_have_guid: true,
394            locale_file_name: Some("language.txt".to_owned()),
395            banned_packedfiles: vec![],
396            icon_small: "gs_ph_dyn.png".to_owned(),
397            icon_big: "gs_big_ph_dyn.png".to_owned(),
398            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
399            install_data: {
400                let mut data = HashMap::new();
401                data.insert(InstallType::WinSteam, InstallData {
402                    vanilla_packs: vec![],
403                    use_manifest: true,
404                    store_id: 2_951_630,
405                    store_id_ak: 2_951_670,
406                    executable: "Pharaoh.exe".to_owned(),
407                    data_path: "data".to_owned(),
408                    language_path: "data".to_owned(),
409                    local_mods_path: "data".to_owned(),
410                    downloaded_mods_path: "./../../workshop/content/2951630".to_owned(),
411                    config_folder: Some("PharaohDynasties".to_owned()),
412                });
413
414                data
415            },
416            tool_vars: {
417                let mut vars = HashMap::new();
418                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
419                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
420                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
421
422                vars.insert("faction_painter_banner_table_name".to_owned(), "factions_tables".to_owned());
423                vars.insert("faction_painter_banner_table_definition".to_owned(), "factions_definition".to_owned());
424                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
425                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "banner_colour_primary".to_owned());
426                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "banner_colour_secondary".to_owned());
427                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "banner_colour_tertiary".to_owned());
428                vars.insert("faction_painter_banner_row_key".to_owned(), "faction_row".to_owned());
429
430                vars.insert("faction_painter_uniform_table_name".to_owned(), "factions_tables".to_owned());
431                vars.insert("faction_painter_uniform_table_definition".to_owned(), "factions_definition".to_owned());
432                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "key".to_owned());
433                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "uniform_colour_primary".to_owned());
434                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "uniform_colour_secondary".to_owned());
435                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "uniform_colour_tertiary".to_owned());
436                vars.insert("faction_painter_uniform_row_key".to_owned(), "faction_row".to_owned());
437                vars
438            },
439            lua_autogen_folder: None,
440            ak_lost_fields: vec![
441                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
442                "_kv_experience_bonuses/description".to_owned(),
443                "_kv_fatigue/description".to_owned(),
444                "_kv_fire_values/description".to_owned(),
445                "_kv_key_buildings/description".to_owned(),
446                "_kv_morale/description".to_owned(),
447                "_kv_naval_morale/description".to_owned(),
448                "_kv_naval_rules/description".to_owned(),
449                "_kv_rules/description".to_owned(),
450                "_kv_ui_tweakers/description".to_owned(),
451                "_kv_unit_ability_scaling_rules/description".to_owned(),
452                "_kv_winds_of_magic_params/description".to_owned(),
453                "achievements/game_expansion_key".to_owned(),
454                "ancillary_info/author".to_owned(),
455                "ancillary_info/comment".to_owned(),
456                "ancillary_info/historical_example".to_owned(),
457                "audio_entity_types/actor_type".to_owned(),
458                "audio_entity_types/game_expansion_key".to_owned(),
459                "audio_entity_types/switch".to_owned(),
460                "audio_markers/colour_blue".to_owned(),
461                "audio_markers/colour_green".to_owned(),
462                "audio_markers/colour_red".to_owned(),
463                "audio_metadata_tags/colour_blue".to_owned(),
464                "audio_metadata_tags/colour_green".to_owned(),
465                "audio_metadata_tags/colour_red".to_owned(),
466                "audio_metadata_tags/game_expansion_key".to_owned(),
467                "audio_metadata_tags/path".to_owned(),
468                "battle_animations_table/game_expansion_key".to_owned(),
469                "battle_personalities/game_expansion_key".to_owned(),
470                "battle_set_pieces/game_expansion_key".to_owned(),
471                "battle_skeletons/game_expansion_key".to_owned(),
472                "battles/game_expansion_key".to_owned(),
473                "battles/objectives_team_1".to_owned(),
474                "battles/objectives_team_2".to_owned(),
475                "building_chains/encyclopedia_group".to_owned(),
476                "building_chains/encyclopedia_include_in_index".to_owned(),
477                "building_chains/encyclopedia_name".to_owned(),
478                "building_culture_variants/flavour".to_owned(),
479                "building_levels/commodity_vol".to_owned(),
480                "cai_algorithm_variables/description".to_owned(),
481                "cai_algorithms/description".to_owned(),
482                "cai_decision_interfaces/description".to_owned(),
483                "cai_decision_items_non_record_bound_types/description".to_owned(),
484                "cai_decision_policies/description".to_owned(),
485                "cai_domain_modifier_functions/description".to_owned(),
486                "cai_domain_variables/description".to_owned(),
487                "cai_domains/description".to_owned(),
488                "cai_queries/description".to_owned(),
489                "cai_query_variables/description".to_owned(),
490                "cai_task_management_system_variables/description".to_owned(),
491                "campaign_ai_managers/description".to_owned(),
492                "campaign_map_playable_areas/game_expansion_key".to_owned(),
493                "campaign_map_playable_areas/maxy".to_owned(),
494                "campaign_map_playable_areas/miny".to_owned(),
495                "campaign_map_playable_areas/preview_border".to_owned(),
496                "campaign_payload_ui_details/comment".to_owned(),
497                "campaign_tree_types/game_expansion_key".to_owned(),
498                "campaign_variables/description".to_owned(),
499                "campaigns/game_expansion_key".to_owned(),
500                "cdir_events_mission_option_junctions/game_expansion_key".to_owned(),
501                "cdir_military_generator_configs/game_expansion_key".to_owned(),
502                "cdir_military_generator_templates/game_expansion_key".to_owned(),
503                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
504                "character_skills/pre_battle_speech_parameter".to_owned(),
505                "character_traits/author".to_owned(),
506                "character_traits/comment".to_owned(),
507                "deployables/icon_name".to_owned(),
508                "diplomatic_relations_religion/relations_modifier".to_owned(),
509                "faction_groups/ui_icon".to_owned(),
510                "factions/game_expansion_key".to_owned(),
511                "frontend_faction_leaders/game_expansion_key".to_owned(),
512                "government_types/elected_ministers".to_owned(),
513                "government_types/hereditary_ministers".to_owned(),
514                "government_types/rank".to_owned(),
515
516                // This is a loc that's unused, so the bruteforce pass fails to mark it as a loc.
517                "land_units/concealed_name".to_owned(),
518
519                "land_units/game_expansion_key".to_owned(),
520                "loading_screen_quotes/game_expansion_key".to_owned(),
521                "main_units/audio_voiceover_culture_override".to_owned(),
522
523                // Special table. Ignore them.
524                "models_building/cs2_file".to_owned(),
525                "models_building/model_file".to_owned(),
526                "models_building/tech_file".to_owned(),
527
528                "names/nobility".to_owned(),
529                "names_groups/Description".to_owned(),
530                "names_groups/game_expansion_key".to_owned(),
531                "pdlc/game_expansion_key".to_owned(),
532
533                // Pretty sure this is a loc that's not exported in Dave, so the bruteforce pass fails to mark it as a loc.
534                "pooled_resources/negative_display_name".to_owned(),
535
536                "projectiles/game_expansion_key".to_owned(),
537                "regions/in_encyclopedia".to_owned(),
538                "regions/is_sea".to_owned(),
539                "scripted_bonus_value_ids/notes".to_owned(),
540                "scripted_objectives/game_expansion_key".to_owned(),
541                "start_pos_calendars/unique".to_owned(),
542                "start_pos_character_ancillaries/unique".to_owned(),
543                "start_pos_character_to_settlements/unique".to_owned(),
544                "start_pos_character_traits/unique".to_owned(),
545                "start_pos_diplomacy/relations_modifier".to_owned(),
546                "start_pos_diplomacy/unique".to_owned(),
547                "start_pos_faction_effect_bundles/unique".to_owned(),
548                "start_pos_factions/unique".to_owned(),
549                "start_pos_family_relationships/unique".to_owned(),
550                "start_pos_land_units/unique".to_owned(),
551                "start_pos_past_events/unique".to_owned(),
552                "start_pos_region_religions/unique".to_owned(),
553                "start_pos_region_slot_templates/unique".to_owned(),
554                "start_pos_regions/unique".to_owned(),
555                "start_pos_settlements/unique".to_owned(),
556                "start_pos_technologies/unique".to_owned(),
557                "technologies/in_encyclopedia".to_owned(),
558                "technology_node_sets/game_expansion_key".to_owned(),
559                "trait_info/applicable_to".to_owned(),
560                "trigger_events/from_ui".to_owned(),
561                "trigger_events/game_expansion_key".to_owned(),
562                "videos/game_expansion_key".to_owned(),
563                "warscape_animated/game_expansion_key".to_owned(),
564            ],
565            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
566            compression_formats_supported: vec![
567                CompressionFormat::Lzma1
568            ],
569            max_cs2_parsed_version: 0
570        });
571
572        // Pharaoh
573        game_list.insert(KEY_PHARAOH, GameInfo {
574            key: KEY_PHARAOH,
575            display_name: DISPLAY_NAME_PHARAOH,
576            pfh_versions: {
577                let mut data = HashMap::new();
578                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
579                data.insert(PFHFileType::Release, PFHVersion::PFH5);
580                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
581                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
582                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
583                data
584            },
585            schema_file_name: "schema_ph.ron".to_owned(),
586            dependencies_cache_file_name: "ph.pak2".to_owned(),
587            raw_db_version: 2,
588            portrait_settings_version: None,
589            supports_editing: true,
590            db_tables_have_guid: true,
591            locale_file_name: Some("language.txt".to_owned()),
592            banned_packedfiles: vec![],
593            icon_small: "gs_ph.png".to_owned(),
594            icon_big: "gs_big_ph.png".to_owned(),
595            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
596            install_data: {
597                let mut data = HashMap::new();
598                data.insert(InstallType::WinSteam, InstallData {
599                    vanilla_packs: vec![],
600                    use_manifest: true,
601                    store_id: 1_937_780, // Normal Game.
602                    //store_id: 2_254_160, // Early Access Weekend
603                    store_id_ak: 1_937_790,
604                    executable: "Pharaoh.exe".to_owned(),
605                    data_path: "data".to_owned(),
606                    language_path: "data".to_owned(),
607                    local_mods_path: "data".to_owned(),
608                    downloaded_mods_path: "./../../workshop/content/1937780".to_owned(), // Normal Game.
609                    //downloaded_mods_path: "./../../workshop/content/2254160".to_owned(), // Early Access Weekend
610                    config_folder: Some("Pharaoh".to_owned()),
611                });
612
613                data
614            },
615            tool_vars: {
616                let mut vars = HashMap::new();
617                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
618                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
619                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
620
621                vars.insert("faction_painter_banner_table_name".to_owned(), "factions_tables".to_owned());
622                vars.insert("faction_painter_banner_table_definition".to_owned(), "factions_definition".to_owned());
623                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
624                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "banner_colour_primary".to_owned());
625                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "banner_colour_secondary".to_owned());
626                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "banner_colour_tertiary".to_owned());
627                vars.insert("faction_painter_banner_row_key".to_owned(), "faction_row".to_owned());
628
629                vars.insert("faction_painter_uniform_table_name".to_owned(), "factions_tables".to_owned());
630                vars.insert("faction_painter_uniform_table_definition".to_owned(), "factions_definition".to_owned());
631                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "key".to_owned());
632                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "uniform_colour_primary".to_owned());
633                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "uniform_colour_secondary".to_owned());
634                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "uniform_colour_tertiary".to_owned());
635                vars.insert("faction_painter_uniform_row_key".to_owned(), "faction_row".to_owned());
636                vars
637            },
638            lua_autogen_folder: None,
639            ak_lost_fields: vec![
640                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
641                "_kv_experience_bonuses/description".to_owned(),
642                "_kv_fatigue/description".to_owned(),
643                "_kv_fire_values/description".to_owned(),
644                "_kv_key_buildings/description".to_owned(),
645                "_kv_morale/description".to_owned(),
646                "_kv_naval_morale/description".to_owned(),
647                "_kv_naval_rules/description".to_owned(),
648                "_kv_rules/description".to_owned(),
649                "_kv_ui_tweakers/description".to_owned(),
650                "_kv_unit_ability_scaling_rules/description".to_owned(),
651                "_kv_winds_of_magic_params/description".to_owned(),
652                "achievements/game_expansion_key".to_owned(),
653                "ancillary_info/author".to_owned(),
654                "ancillary_info/comment".to_owned(),
655                "ancillary_info/historical_example".to_owned(),
656                "audio_entity_types/actor_type".to_owned(),
657                "audio_entity_types/game_expansion_key".to_owned(),
658                "audio_entity_types/switch".to_owned(),
659                "audio_markers/colour_blue".to_owned(),
660                "audio_markers/colour_green".to_owned(),
661                "audio_markers/colour_red".to_owned(),
662                "audio_metadata_tags/colour_blue".to_owned(),
663                "audio_metadata_tags/colour_green".to_owned(),
664                "audio_metadata_tags/colour_red".to_owned(),
665                "audio_metadata_tags/game_expansion_key".to_owned(),
666                "audio_metadata_tags/path".to_owned(),
667                "battle_animations_table/game_expansion_key".to_owned(),
668                "battle_personalities/game_expansion_key".to_owned(),
669                "battle_set_pieces/game_expansion_key".to_owned(),
670                "battle_skeletons/game_expansion_key".to_owned(),
671                "battles/game_expansion_key".to_owned(),
672                "battles/objectives_team_1".to_owned(),
673                "battles/objectives_team_2".to_owned(),
674                "building_chains/encyclopedia_group".to_owned(),
675                "building_chains/encyclopedia_include_in_index".to_owned(),
676                "building_chains/encyclopedia_name".to_owned(),
677                "building_culture_variants/flavour".to_owned(),
678                "building_levels/commodity_vol".to_owned(),
679                "cai_algorithm_variables/description".to_owned(),
680                "cai_algorithms/description".to_owned(),
681                "cai_decision_interfaces/description".to_owned(),
682                "cai_decision_items_non_record_bound_types/description".to_owned(),
683                "cai_decision_policies/description".to_owned(),
684                "cai_domain_modifier_functions/description".to_owned(),
685                "cai_domain_variables/description".to_owned(),
686                "cai_domains/description".to_owned(),
687                "cai_queries/description".to_owned(),
688                "cai_query_variables/description".to_owned(),
689                "cai_task_management_system_variables/description".to_owned(),
690                "campaign_ai_managers/description".to_owned(),
691                "campaign_map_playable_areas/game_expansion_key".to_owned(),
692                "campaign_map_playable_areas/maxy".to_owned(),
693                "campaign_map_playable_areas/miny".to_owned(),
694                "campaign_map_playable_areas/preview_border".to_owned(),
695                "campaign_payload_ui_details/comment".to_owned(),
696                "campaign_tree_types/game_expansion_key".to_owned(),
697                "campaign_variables/description".to_owned(),
698                "campaigns/game_expansion_key".to_owned(),
699                "cdir_events_mission_option_junctions/game_expansion_key".to_owned(),
700                "cdir_military_generator_configs/game_expansion_key".to_owned(),
701                "cdir_military_generator_templates/game_expansion_key".to_owned(),
702                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
703                "character_skills/pre_battle_speech_parameter".to_owned(),
704                "character_traits/author".to_owned(),
705                "character_traits/comment".to_owned(),
706                "deployables/icon_name".to_owned(),
707                "diplomatic_relations_religion/relations_modifier".to_owned(),
708                "faction_groups/ui_icon".to_owned(),
709                "factions/game_expansion_key".to_owned(),
710                "frontend_faction_leaders/game_expansion_key".to_owned(),
711                "government_types/elected_ministers".to_owned(),
712                "government_types/hereditary_ministers".to_owned(),
713                "government_types/rank".to_owned(),
714
715                // This is a loc that's unused, so the bruteforce pass fails to mark it as a loc.
716                "land_units/concealed_name".to_owned(),
717
718                "land_units/game_expansion_key".to_owned(),
719                "loading_screen_quotes/game_expansion_key".to_owned(),
720                "main_units/audio_voiceover_culture_override".to_owned(),
721
722                // Special table. Ignore them.
723                "models_building/cs2_file".to_owned(),
724                "models_building/model_file".to_owned(),
725                "models_building/tech_file".to_owned(),
726
727                "names/nobility".to_owned(),
728                "names_groups/Description".to_owned(),
729                "names_groups/game_expansion_key".to_owned(),
730                "pdlc/game_expansion_key".to_owned(),
731
732                // Pretty sure this is a loc that's not exported in Dave, so the bruteforce pass fails to mark it as a loc.
733                "pooled_resources/negative_display_name".to_owned(),
734
735                "projectiles/game_expansion_key".to_owned(),
736                "regions/in_encyclopedia".to_owned(),
737                "regions/is_sea".to_owned(),
738                "scripted_bonus_value_ids/notes".to_owned(),
739                "scripted_objectives/game_expansion_key".to_owned(),
740                "start_pos_calendars/unique".to_owned(),
741                "start_pos_character_ancillaries/unique".to_owned(),
742                "start_pos_character_to_settlements/unique".to_owned(),
743                "start_pos_character_traits/unique".to_owned(),
744                "start_pos_diplomacy/relations_modifier".to_owned(),
745                "start_pos_diplomacy/unique".to_owned(),
746                "start_pos_faction_effect_bundles/unique".to_owned(),
747                "start_pos_factions/unique".to_owned(),
748                "start_pos_land_units/unique".to_owned(),
749                "start_pos_past_events/unique".to_owned(),
750                "start_pos_region_religions/unique".to_owned(),
751                "start_pos_region_slot_templates/unique".to_owned(),
752                "start_pos_regions/unique".to_owned(),
753                "start_pos_settlements/unique".to_owned(),
754                "technologies/in_encyclopedia".to_owned(),
755                "technology_node_sets/game_expansion_key".to_owned(),
756                "trait_info/applicable_to".to_owned(),
757                "trigger_events/from_ui".to_owned(),
758                "trigger_events/game_expansion_key".to_owned(),
759                "videos/game_expansion_key".to_owned(),
760                "warscape_animated/game_expansion_key".to_owned(),
761            ],
762            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
763            compression_formats_supported: vec![
764                CompressionFormat::Lzma1
765            ],
766            max_cs2_parsed_version: 0
767        });
768
769        // Warhammer 3
770        game_list.insert(KEY_WARHAMMER_3, GameInfo {
771            key: KEY_WARHAMMER_3,
772            display_name: DISPLAY_NAME_WARHAMMER_3,
773            pfh_versions: {
774                let mut data = HashMap::new();
775                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
776                data.insert(PFHFileType::Release, PFHVersion::PFH5);
777                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
778                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
779                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
780                data
781            },
782            schema_file_name: "schema_wh3.ron".to_owned(),
783            dependencies_cache_file_name: "wh3.pak2".to_owned(),
784            raw_db_version: 2,
785            portrait_settings_version: Some(4),
786            supports_editing: true,
787            db_tables_have_guid: true,
788            locale_file_name: Some("language.txt".to_owned()),
789            banned_packedfiles: vec![
790                "db/agent_subtype_ownership_content_pack_junctions_tables".to_owned(),
791                "db/allied_recruitment_core_units_tables".to_owned(),
792                "db/battle_ownership_content_pack_junctions_tables".to_owned(),
793                "db/building_chain_ownership_content_pack_junctions_tables".to_owned(),
794                "db/building_level_ownership_content_pack_junctions_tables".to_owned(),
795                "db/campaign_map_playable_area_ownership_content_pack_junctions_tables".to_owned(),
796                "db/faction_ownership_content_pack_junctions_tables".to_owned(),
797                "db/loading_screen_quote_ownership_content_pack_junctions_tables".to_owned(),
798                "db/main_unit_ownership_content_pack_junctions_tables".to_owned(),
799                "db/ownership_products_tables".to_owned(),
800                "db/ownership_content_packs_tables".to_owned(),
801                "db/ownership_content_pack_required_products_tables".to_owned(),
802                "db/ownership_content_pack_requirements_tables".to_owned(),
803                "db/ritual_ownership_content_pack_junctions_tables".to_owned(),
804                "db/technology_ownership_content_pack_junctions_tables".to_owned(),
805            ],
806            icon_small: "gs_wh3.png".to_owned(),
807            icon_big: "gs_big_wh3.png".to_owned(),
808            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
809            install_data: {
810                let mut data = HashMap::new();
811                data.insert(InstallType::WinSteam, InstallData {
812                    vanilla_packs: vec![],
813                    use_manifest: true,
814                    store_id: 1_142_710,
815                    store_id_ak: 1_880_380,
816                    executable: "Warhammer3.exe".to_owned(),
817                    data_path: "data".to_owned(),
818                    language_path: "data".to_owned(),
819                    local_mods_path: "data".to_owned(),
820                    downloaded_mods_path: "./../../workshop/content/1142710".to_owned(),
821                    config_folder: Some("Warhammer3".to_owned()),
822                });
823
824                data.insert(InstallType::LnxSteam, InstallData {
825                    vanilla_packs: vec![],
826                    use_manifest: true,
827                    store_id: 1_142_710,
828                    store_id_ak: 1_880_380,
829                    executable: "TotalWarhammer3.sh".to_owned(),
830                    data_path: "share/data/data".to_owned(),
831                    language_path: "share/data/data/localisation".to_owned(),
832                    local_mods_path: "share/data/data".to_owned(),
833                    downloaded_mods_path: "./../../workshop/content/1142710".to_owned(),
834                    config_folder: None,
835                });
836
837                data
838            },
839            tool_vars: {
840                let mut vars = HashMap::new();
841                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
842                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
843                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
844
845                vars.insert("faction_painter_banner_table_name".to_owned(), "factions_tables".to_owned());
846                vars.insert("faction_painter_banner_table_definition".to_owned(), "factions_definition".to_owned());
847                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
848                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "banner_colour_primary".to_owned());
849                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "banner_colour_secondary".to_owned());
850                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "banner_colour_tertiary".to_owned());
851                vars.insert("faction_painter_banner_row_key".to_owned(), "faction_row".to_owned());
852
853                vars.insert("faction_painter_uniform_table_name".to_owned(), "factions_tables".to_owned());
854                vars.insert("faction_painter_uniform_table_definition".to_owned(), "factions_definition".to_owned());
855                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "key".to_owned());
856                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "uniform_colour_primary".to_owned());
857                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "uniform_colour_secondary".to_owned());
858                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "uniform_colour_tertiary".to_owned());
859                vars.insert("faction_painter_uniform_row_key".to_owned(), "faction_row".to_owned());
860                vars
861            },
862            lua_autogen_folder: Some("output/wh3".to_owned()),
863            ak_lost_fields: vec![
864                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
865                "_kv_experience_bonuses/description".to_owned(),
866                "_kv_fatigue/description".to_owned(),
867                "_kv_fire_values/description".to_owned(),
868                "_kv_key_buildings/description".to_owned(),
869                "_kv_morale/description".to_owned(),
870                "_kv_naval_morale/description".to_owned(),
871                "_kv_naval_rules/description".to_owned(),
872                "_kv_rules/description".to_owned(),
873                "_kv_ui_tweakers/description".to_owned(),
874                "_kv_unit_ability_scaling_rules/description".to_owned(),
875                "_kv_winds_of_magic_params/description".to_owned(),
876                "advice_levels/locatable".to_owned(),
877                "agent_recruitment_categories/onscreen_description".to_owned(),
878                "alternative_pooled_resource_junctions/description".to_owned(),
879                "ancillary_info/author".to_owned(),
880                "ancillary_info/comment".to_owned(),
881                "ancillary_info/historical_example".to_owned(),
882                "audio_entity_types/game_expansion_key".to_owned(),
883                "audio_markers/colour_blue".to_owned(),
884                "audio_markers/colour_green".to_owned(),
885                "audio_markers/colour_red".to_owned(),
886                "audio_metadata_tags/colour_blue".to_owned(),
887                "audio_metadata_tags/colour_green".to_owned(),
888                "audio_metadata_tags/colour_red".to_owned(),
889                "audio_metadata_tags/game_expansion_key".to_owned(),
890                "audio_metadata_tags/path".to_owned(),
891                "battle_animations_table/game_expansion_key".to_owned(),
892                "battle_personalities/game_expansion_key".to_owned(),
893                "battle_set_pieces/game_expansion_key".to_owned(),
894                "battle_skeletons/game_expansion_key".to_owned(),
895                "battles/game_expansion_key".to_owned(),
896                "battles/objectives_team_1".to_owned(),
897                "battles/objectives_team_2".to_owned(),
898                "building_chains/encyclopedia_group".to_owned(),
899                "building_chains/encyclopedia_include_in_index".to_owned(),
900                "building_culture_variants/flavour".to_owned(),
901                "building_levels/commodity_vol".to_owned(),
902                "cai_algorithm_variables/description".to_owned(),
903                "cai_algorithms/description".to_owned(),
904                "cai_decision_interfaces/description".to_owned(),
905                "cai_decision_items_non_record_bound_types/description".to_owned(),
906                "cai_decision_policies/description".to_owned(),
907                "cai_domain_modifier_functions/description".to_owned(),
908                "cai_domain_variables/description".to_owned(),
909                "cai_domains/description".to_owned(),
910                "cai_queries/description".to_owned(),
911                "cai_query_variables/description".to_owned(),
912                "cai_task_management_system_variables/description".to_owned(),
913                "campaign_ai_managers/description".to_owned(),
914                "campaign_map_playable_areas/game_expansion_key".to_owned(),
915                "campaign_map_playable_areas/maxy".to_owned(),
916                "campaign_map_playable_areas/miny".to_owned(),
917                "campaign_map_playable_areas/preview_border".to_owned(),
918                "campaign_payload_ui_details/comment".to_owned(),
919                "campaign_settlement_display_building_ids/sub_culture".to_owned(),
920                "campaign_tree_types/game_expansion_key".to_owned(),
921                "campaign_variables/description".to_owned(),
922                "campaigns/game_expansion_key".to_owned(),
923                "cdir_event_targets/description".to_owned(),
924                "cdir_events_options/notes".to_owned(),
925                "cdir_events_payloads/notes".to_owned(),
926                "cdir_events_targets/description".to_owned(),
927                "cdir_military_generator_configs/game_expansion_key".to_owned(),
928                "cdir_military_generator_templates/game_expansion_key".to_owned(),
929                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
930                "character_skills/pre_battle_speech_parameter".to_owned(),
931                "character_traits/author".to_owned(),
932                "character_traits/comment".to_owned(),
933                "deployables/icon_name".to_owned(),
934                "faction_groups/ui_icon".to_owned(),
935                "factions/game_expansion_key".to_owned(),
936                "frontend_faction_leaders/game_expansion_key".to_owned(),
937                "land_units/game_expansion_key".to_owned(),
938                "loading_screen_quotes/game_expansion_key".to_owned(),
939                "mercenary_pool_to_groups_junctions/game_expansion_key".to_owned(),
940
941                // Special table. Ignore them.
942                "models_building/cs2_file".to_owned(),
943                "models_building/model_file".to_owned(),
944                "models_building/tech_file".to_owned(),
945
946                "names_groups/Description".to_owned(),
947                "names_groups/game_expansion_key".to_owned(),
948                "pdlc/game_expansion_key".to_owned(),
949                "projectiles/game_expansion_key".to_owned(),
950                "regions/in_encyclopedia".to_owned(),
951                "regions/is_sea".to_owned(),
952                "resources/campaign_group".to_owned(),
953                "scripted_bonus_value_ids/notes".to_owned(),
954                "scripted_objectives/game_expansion_key".to_owned(),
955                "start_pos_calendars/unique".to_owned(),
956                "start_pos_character_ancillaries/unique".to_owned(),
957                "start_pos_character_to_settlements/unique".to_owned(),
958                "start_pos_character_traits/unique".to_owned(),
959                "start_pos_diplomacy/relations_modifier".to_owned(),
960                "start_pos_diplomacy/unique".to_owned(),
961                "start_pos_factions/honour".to_owned(),
962                "start_pos_factions/unique".to_owned(),
963                "start_pos_land_units/unique".to_owned(),
964                "start_pos_naval_units/unique".to_owned(),
965                "start_pos_past_events/unique".to_owned(),
966                "start_pos_regions/unique".to_owned(),
967                "start_pos_region_slot_templates/unique".to_owned(),
968                "start_pos_settlement_garrisons/unique".to_owned(),
969                "start_pos_settlements/unique".to_owned(),
970                "start_pos_victory_conditions/unique".to_owned(),
971                "technologies/in_encyclopedia".to_owned(),
972                "technology_node_sets/game_expansion_key".to_owned(),
973                "trait_info/applicable_to".to_owned(),
974                "trigger_events/from_ui".to_owned(),
975                "trigger_events/game_expansion_key".to_owned(),
976                "videos/game_expansion_key".to_owned(),
977                "warscape_animated/game_expansion_key".to_owned(),
978            ],
979            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
980            compression_formats_supported: vec![
981                CompressionFormat::Zstd,
982                CompressionFormat::Lz4,
983                CompressionFormat::Lzma1
984            ],
985            max_cs2_parsed_version: 0
986        });
987
988        // Troy
989        game_list.insert(KEY_TROY, GameInfo {
990            key: KEY_TROY,
991            display_name: DISPLAY_NAME_TROY,
992            pfh_versions: {
993                let mut data = HashMap::new();
994                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
995                data.insert(PFHFileType::Release, PFHVersion::PFH5);
996                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
997                data.insert(PFHFileType::Mod, PFHVersion::PFH6);
998                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
999                data
1000            },
1001            schema_file_name: "schema_troy.ron".to_owned(),
1002            dependencies_cache_file_name: "troy.pak2".to_owned(),
1003            raw_db_version: 2,
1004            portrait_settings_version: None,
1005            supports_editing: true,
1006            db_tables_have_guid: true,
1007            locale_file_name: Some("language.txt".to_owned()),
1008            banned_packedfiles: vec![],
1009            icon_small: "gs_troy.png".to_owned(),
1010            icon_big: "gs_big_troy.png".to_owned(),
1011            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
1012            install_data: {
1013                let mut data = HashMap::new();
1014                data.insert(InstallType::WinEpic, InstallData {
1015                    vanilla_packs: vec![],
1016                    use_manifest: true,
1017                    store_id: 0,
1018                    store_id_ak: 0,
1019                    executable: "Troy.exe".to_owned(),
1020                    data_path: "data".to_owned(),
1021                    language_path: "data".to_owned(),
1022                    local_mods_path: "mods/mymods".to_owned(),
1023                    downloaded_mods_path: "mods".to_owned(),
1024                    config_folder: None,
1025                });
1026
1027                data.insert(InstallType::WinSteam, InstallData {
1028                    vanilla_packs: vec![],
1029                    use_manifest: true,
1030                    store_id: 1_099_410,
1031                    store_id_ak: 1_356_310,
1032                    executable: "Troy.exe".to_owned(),
1033                    data_path: "data".to_owned(),
1034                    language_path: "data".to_owned(),
1035                    local_mods_path: "data".to_owned(),
1036                    downloaded_mods_path: "./../../workshop/content/1099410".to_owned(),
1037                    config_folder: Some("Troy_Steam".to_owned()),
1038                });
1039
1040                data
1041            },
1042            tool_vars: {
1043                let mut vars = HashMap::new();
1044                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
1045                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
1046                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
1047
1048                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
1049                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
1050                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
1051                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
1052                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
1053                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
1054                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
1055
1056
1057                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
1058                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
1059                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
1060                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
1061                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
1062                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
1063                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
1064
1065                vars
1066            },
1067            lua_autogen_folder: None,
1068            ak_lost_fields: vec![
1069                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
1070                "_kv_experience_bonuses/description".to_owned(),
1071                "_kv_fatigue/description".to_owned(),
1072                "_kv_fire_values/description".to_owned(),
1073                "_kv_key_buildings/description".to_owned(),
1074                "_kv_morale/description".to_owned(),
1075                "_kv_naval_morale/description".to_owned(),
1076                "_kv_naval_rules/description".to_owned(),
1077                "_kv_rules/description".to_owned(),
1078                "_kv_ui_tweakers/description".to_owned(),
1079                "_kv_unit_ability_scaling_rules/description".to_owned(),
1080                "_kv_winds_of_magic_params/description".to_owned(),
1081                "achievements/game_expansion_key".to_owned(),
1082                "ancillary_info/author".to_owned(),
1083                "ancillary_info/comment".to_owned(),
1084                "ancillary_info/historical_example".to_owned(),
1085                "audio_entity_types/actor_type".to_owned(),
1086                "audio_entity_types/game_expansion_key".to_owned(),
1087                "audio_entity_types/switch".to_owned(),
1088                "audio_markers/colour_blue".to_owned(),
1089                "audio_markers/colour_green".to_owned(),
1090                "audio_markers/colour_red".to_owned(),
1091                "audio_metadata_tags/colour_blue".to_owned(),
1092                "audio_metadata_tags/colour_green".to_owned(),
1093                "audio_metadata_tags/colour_red".to_owned(),
1094                "audio_metadata_tags/game_expansion_key".to_owned(),
1095                "audio_metadata_tags/path".to_owned(),
1096                "battle_animations_table/game_expansion_key".to_owned(),
1097                "battle_personalities/game_expansion_key".to_owned(),
1098                "battle_set_pieces/game_expansion_key".to_owned(),
1099                "battle_skeletons/game_expansion_key".to_owned(),
1100                "battles/game_expansion_key".to_owned(),
1101                "battles/objectives_team_1".to_owned(),
1102                "battles/objectives_team_2".to_owned(),
1103                "building_chains/encyclopedia_group".to_owned(),
1104                "building_chains/encyclopedia_include_in_index".to_owned(),
1105                "building_culture_variants/flavour".to_owned(),
1106                "building_levels/commodity_vol".to_owned(),
1107                "cai_task_management_system_variables/description".to_owned(),
1108                "campaign_ai_managers/description".to_owned(),
1109                "campaign_map_playable_areas/game_expansion_key".to_owned(),
1110                "campaign_map_playable_areas/maxy".to_owned(),
1111                "campaign_map_playable_areas/miny".to_owned(),
1112                "campaign_map_playable_areas/preview_border".to_owned(),
1113                "campaign_payload_ui_details/comment".to_owned(),
1114                "campaign_tree_types/game_expansion_key".to_owned(),
1115                "campaign_variables/description".to_owned(),
1116                "campaigns/game_expansion_key".to_owned(),
1117                "cdir_events_mission_option_junctions/game_expansion_key".to_owned(),
1118                "cdir_military_generator_configs/game_expansion_key".to_owned(),
1119                "cdir_military_generator_templates/game_expansion_key".to_owned(),
1120                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
1121                "character_skills/pre_battle_speech_parameter".to_owned(),
1122                "character_traits/author".to_owned(),
1123                "character_traits/comment".to_owned(),
1124                "deployables/icon_name".to_owned(),
1125                "diplomatic_relations_religion/relations_modifier".to_owned(),
1126                "faction_groups/ui_icon".to_owned(),
1127                "factions/game_expansion_key".to_owned(),
1128                "frontend_faction_leaders/game_expansion_key".to_owned(),
1129                "government_types/elected_ministers".to_owned(),
1130                "government_types/hereditary_ministers".to_owned(),
1131                "government_types/rank".to_owned(),
1132                "land_units/game_expansion_key".to_owned(),
1133                "loading_screen_quotes/game_expansion_key".to_owned(),
1134                "main_units/audio_voiceover_culture".to_owned(),
1135                "main_units/audio_voiceover_culture_override".to_owned(),
1136
1137                // Special table. Ignore them.
1138                "models_building/cs2_file".to_owned(),
1139                "models_building/model_file".to_owned(),
1140                "models_building/tech_file".to_owned(),
1141
1142                "names/nobility".to_owned(),
1143                "names_groups/Description".to_owned(),
1144                "names_groups/game_expansion_key".to_owned(),
1145                "pdlc/game_expansion_key".to_owned(),
1146                "projectiles/game_expansion_key".to_owned(),
1147                "regions/in_encyclopedia".to_owned(),
1148                "regions/is_sea".to_owned(),
1149                "scripted_objectives/game_expansion_key".to_owned(),
1150                "start_pos_calendars/unique".to_owned(),
1151                "start_pos_character_ancillaries/unique".to_owned(),
1152                "start_pos_character_to_settlements/unique".to_owned(),
1153                "start_pos_character_traits/unique".to_owned(),
1154                "start_pos_diplomacy/relations_modifier".to_owned(),
1155                "start_pos_diplomacy/unique".to_owned(),
1156                "start_pos_faction_effect_bundles/unique".to_owned(),
1157                "start_pos_factions/unique".to_owned(),
1158                "start_pos_family_relationships/unique".to_owned(),
1159                "start_pos_land_units/unique".to_owned(),
1160                "start_pos_naval_units/unique".to_owned(),
1161                "start_pos_past_events/unique".to_owned(),
1162                "start_pos_region_religions/unique".to_owned(),
1163                "start_pos_region_slot_templates/unique".to_owned(),
1164                "start_pos_regions/unique".to_owned(),
1165                "start_pos_regions_to_unit_resources/unique".to_owned(),
1166                "start_pos_settlement_garrisons/unique".to_owned(),
1167                "start_pos_settlements/unique".to_owned(),
1168                "start_pos_technologies/unique".to_owned(),
1169                "start_pos_victory_conditions/unique".to_owned(),
1170                "technologies/in_encyclopedia".to_owned(),
1171                "technology_node_sets/game_expansion_key".to_owned(),
1172                "trait_info/applicable_to".to_owned(),
1173                "trigger_events/from_ui".to_owned(),
1174                "trigger_events/game_expansion_key".to_owned(),
1175                "videos/game_expansion_key".to_owned(),
1176                "warscape_animated/game_expansion_key".to_owned(),
1177            ],
1178            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
1179            compression_formats_supported: vec![
1180                CompressionFormat::Lzma1
1181            ],
1182            max_cs2_parsed_version: 0
1183        });
1184
1185        // Three Kingdoms
1186        game_list.insert(KEY_THREE_KINGDOMS, GameInfo {
1187            key: KEY_THREE_KINGDOMS,
1188            display_name: DISPLAY_NAME_THREE_KINGDOMS,
1189            pfh_versions: {
1190                let mut data = HashMap::new();
1191                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
1192                data.insert(PFHFileType::Release, PFHVersion::PFH5);
1193                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
1194                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
1195                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
1196                data
1197            },
1198            schema_file_name: "schema_3k.ron".to_owned(),
1199            dependencies_cache_file_name: "3k.pak2".to_owned(),
1200            raw_db_version: 2,
1201            portrait_settings_version: None,
1202            supports_editing: true,
1203            db_tables_have_guid: true,
1204            locale_file_name: Some("language.txt".to_owned()),
1205            banned_packedfiles: vec![],
1206            icon_small: "gs_3k.png".to_owned(),
1207            icon_big: "gs_big_3k.png".to_owned(),
1208            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
1209
1210            install_data: {
1211                let mut data = HashMap::new();
1212                data.insert(InstallType::WinSteam, InstallData {
1213                    vanilla_packs: vec![
1214                        "audio.pack".to_owned(),
1215                        "audio_bl.pack".to_owned(),
1216                        "boot.pack".to_owned(),
1217                        "data.pack".to_owned(),
1218                        "data_bl.pack".to_owned(),
1219                        "data_dlc06.pack".to_owned(),
1220                        "data_dlc07.pack".to_owned(),
1221                        "data_ep.pack".to_owned(),
1222                        "data_mh.pack".to_owned(),
1223                        "data_yt.pack".to_owned(),
1224                        "data_yt_bl.pack".to_owned(),
1225                        "database.pack".to_owned(),
1226                        "fast.pack".to_owned(),
1227                        "fast_bl.pack".to_owned(),
1228                        "local_en.pack".to_owned(),     // English
1229                        "local_br.pack".to_owned(),     // Brazilian
1230                        "local_cz.pack".to_owned(),     // Czech
1231                        "local_ge.pack".to_owned(),     // German
1232                        "local_sp.pack".to_owned(),     // Spanish
1233                        "local_fr.pack".to_owned(),     // French
1234                        "local_it.pack".to_owned(),     // Italian
1235                        "local_kr.pack".to_owned(),     // Korean
1236                        "local_pl.pack".to_owned(),     // Polish
1237                        "local_ru.pack".to_owned(),     // Russian
1238                        "local_tr.pack".to_owned(),     // Turkish
1239                        "local_cn.pack".to_owned(),     // Simplified Chinese
1240                        "local_zh.pack".to_owned(),     // Traditional Chinese
1241                        "models.pack".to_owned(),
1242                        "models2.pack".to_owned(),
1243                        "movies.pack".to_owned(),
1244                        "movies_bl.pack".to_owned(),
1245                        "movies_dlc06.pack".to_owned(),
1246                        "movies_ep.pack".to_owned(),
1247                        "movies_mh.pack".to_owned(),
1248                        "movies_wb.pack".to_owned(),
1249                        "movies_yt.pack".to_owned(),
1250                        "movies_yt_bl.pack".to_owned(),
1251                        "movies2.pack".to_owned(),
1252                        "shaders.pack".to_owned(),
1253                        "shaders_bl.pack".to_owned(),
1254                        "terrain.pack".to_owned(),
1255                        "terrain2.pack".to_owned(),
1256                        "terrain3.pack".to_owned(),
1257                        "terrain4.pack".to_owned(),
1258                        "terrain5.pack".to_owned(),
1259                        "variants.pack".to_owned(),
1260                        "variants_bl.pack".to_owned(),
1261                        "variants_dds.pack".to_owned(),
1262                        "variants_dds_bl.pack".to_owned(),
1263                        "vegetation.pack".to_owned(),
1264                    ],
1265                    use_manifest: false,
1266                    store_id: 779_340,
1267                    store_id_ak: 1_012_260,
1268                    executable: "Three_Kingdoms.exe".to_owned(),
1269                    data_path: "data".to_owned(),
1270                    language_path: "data".to_owned(),
1271                    local_mods_path: "data".to_owned(),
1272                    downloaded_mods_path: "./../../workshop/content/779340".to_owned(),
1273                    config_folder: Some("ThreeKingdoms".to_owned()),
1274                });
1275
1276                data.insert(InstallType::LnxSteam, InstallData {
1277                    vanilla_packs: vec![
1278                        "audio.pack".to_owned(),
1279                        "audio_bl.pack".to_owned(),
1280                        "boot.pack".to_owned(),
1281                        "data.pack".to_owned(),
1282                        "data_bl.pack".to_owned(),
1283                        "data_dlc06.pack".to_owned(),
1284                        "data_dlc07.pack".to_owned(),
1285                        "../../../data/data_dlc07.pack".to_owned(),
1286                        "data_ep.pack".to_owned(),
1287                        "data_mh.pack".to_owned(),
1288                        "data_yt.pack".to_owned(),
1289                        "data_yt_bl.pack".to_owned(),
1290                        "database.pack".to_owned(),
1291                        "fast.pack".to_owned(),
1292                        "fast_bl.pack".to_owned(),
1293                        "localisation/en/local_en.pack".to_owned(),     // English
1294                        "localisation/br/local_br.pack".to_owned(),     // Brazilian
1295                        "localisation/cz/local_cz.pack".to_owned(),     // Czech
1296                        "localisation/ge/local_ge.pack".to_owned(),     // German
1297                        "localisation/sp/local_sp.pack".to_owned(),     // Spanish
1298                        "localisation/fr/local_fr.pack".to_owned(),     // French
1299                        "localisation/it/local_it.pack".to_owned(),     // Italian
1300                        "localisation/kr/local_kr.pack".to_owned(),     // Korean
1301                        "localisation/pl/local_pl.pack".to_owned(),     // Polish
1302                        "localisation/ru/local_ru.pack".to_owned(),     // Russian
1303                        "localisation/tr/local_tr.pack".to_owned(),     // Turkish
1304                        "localisation/cn/local_cn.pack".to_owned(),     // Simplified Chinese
1305                        "localisation/zh/local_zh.pack".to_owned(),     // Traditional Chinese
1306                        "models.pack".to_owned(),
1307                        "models2.pack".to_owned(),
1308                        "movies.pack".to_owned(),
1309                        "movies_bl.pack".to_owned(),
1310                        "movies_dlc06.pack".to_owned(),
1311                        "movies_ep.pack".to_owned(),
1312                        "movies_mh.pack".to_owned(),
1313                        "movies_wb.pack".to_owned(),
1314                        "movies_yt.pack".to_owned(),
1315                        "movies_yt_bl.pack".to_owned(),
1316                        "movies2.pack".to_owned(),
1317                        "shaders.pack".to_owned(),
1318                        "shaders_bl.pack".to_owned(),
1319                        "terrain.pack".to_owned(),
1320                        "terrain2.pack".to_owned(),
1321                        "terrain3.pack".to_owned(),
1322                        "terrain4.pack".to_owned(),
1323                        "terrain5.pack".to_owned(),
1324                        "variants.pack".to_owned(),
1325                        "variants_bl.pack".to_owned(),
1326                        "variants_dds.pack".to_owned(),
1327                        "variants_dds_bl.pack".to_owned(),
1328                        "vegetation.pack".to_owned(),
1329                    ],
1330                    use_manifest: false,
1331                    store_id: 779_340,
1332                    store_id_ak: 1_012_260,
1333                    executable: "ThreeKingdoms.sh".to_owned(),
1334                    data_path: "share/data/data".to_owned(),
1335                    language_path: "share/data/data/localisation".to_owned(),
1336                    local_mods_path: "share/data/data".to_owned(),
1337                    downloaded_mods_path: "./../../workshop/content/779340".to_owned(),
1338                    config_folder: None,
1339                });
1340
1341                data
1342            },
1343            tool_vars: {
1344                let mut vars = HashMap::new();
1345                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
1346                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
1347                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
1348
1349                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
1350                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
1351                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
1352                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
1353                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
1354                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
1355                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
1356
1357                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
1358                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
1359                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
1360                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
1361                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
1362                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
1363                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
1364                vars
1365            },
1366            lua_autogen_folder: None,
1367            ak_lost_fields: vec![
1368                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
1369                "_kv_experience_bonuses/description".to_owned(),
1370                "_kv_fatigue/description".to_owned(),
1371                "_kv_fire_values/description".to_owned(),
1372                "_kv_key_buildings/description".to_owned(),
1373                "_kv_morale/description".to_owned(),
1374                "_kv_naval_morale/description".to_owned(),
1375                "_kv_naval_rules/description".to_owned(),
1376                "_kv_rules/description".to_owned(),
1377                "_kv_ui_tweakers/description".to_owned(),
1378                "_kv_unit_ability_scaling_rules/description".to_owned(),
1379                "_kv_winds_of_magic_params/description".to_owned(),
1380                "achievements/game_expansion_key".to_owned(),
1381                "advice_levels/locatable".to_owned(),
1382                "audio_entity_types/game_expansion_key".to_owned(),
1383                "audio_markers/colour_blue".to_owned(),
1384                "audio_markers/colour_green".to_owned(),
1385                "audio_markers/colour_red".to_owned(),
1386                "audio_metadata_tags/colour_blue".to_owned(),
1387                "audio_metadata_tags/colour_green".to_owned(),
1388                "audio_metadata_tags/colour_red".to_owned(),
1389                "audio_metadata_tags/game_expansion_key".to_owned(),
1390                "audio_metadata_tags/path".to_owned(),
1391                "battle_animations_table/game_expansion_key".to_owned(),
1392                "battle_personalities/game_expansion_key".to_owned(),
1393                "battle_set_pieces/game_expansion_key".to_owned(),
1394                "battle_skeletons/game_expansion_key".to_owned(),
1395                "battles/game_expansion_key".to_owned(),
1396                "battles/objectives_team_1".to_owned(),
1397                "battles/objectives_team_2".to_owned(),
1398                "building_chains/encyclopedia_group".to_owned(),
1399                "building_chains/encyclopedia_include_in_index".to_owned(),
1400                "building_culture_variants/flavour".to_owned(),
1401                "building_levels/commodity_vol".to_owned(),
1402                "cai_task_management_system_variables/description".to_owned(),
1403                "campaign_ai_managers/description".to_owned(),
1404                "campaign_diplomacy_automatic_deal_situations/comments".to_owned(),
1405                "campaign_effect_scopes/source_for_design_ref_only".to_owned(),
1406                "campaign_map_playable_areas/game_expansion_key".to_owned(),
1407                "campaign_map_playable_areas/maxy".to_owned(),
1408                "campaign_map_playable_areas/miny".to_owned(),
1409                "campaign_map_playable_areas/preview_border".to_owned(),
1410                "campaign_payload_ui_details/comment".to_owned(),
1411                "campaign_settlement_display_building_ids/sub_culture".to_owned(),
1412                "campaign_variables/description".to_owned(),
1413                "campaigns/game_expansion_key".to_owned(),
1414                "ccp_balance_values/description".to_owned(),
1415                "cdir_events_options/notes".to_owned(),
1416                "cdir_events_post_generation_conditions/notes".to_owned(),
1417                "cdir_events_targets/description".to_owned(),
1418                "cdir_military_generator_configs/game_expansion_key".to_owned(),
1419                "cdir_military_generator_templates/game_expansion_key".to_owned(),
1420                "ceo_initial_datas/template_manager".to_owned(),
1421                "character_skills/pre_battle_speech_parameter".to_owned(),
1422                "cultures/audio_state".to_owned(),
1423                "deployables/icon_name".to_owned(),
1424                "diplomatic_relations_religion/relations_modifier".to_owned(),
1425                "experience_triggers/condition".to_owned(),
1426                "experience_triggers/event".to_owned(),
1427                "experience_triggers/target".to_owned(),
1428                "factions/game_expansion_key".to_owned(),
1429                "hero_battle_conversation_strings/game_expansion_key".to_owned(),
1430                "land_units/game_expansion_key".to_owned(),
1431                "loading_screen_quotes/game_expansion_key".to_owned(),
1432                "loading_screen_speech_strings/game_expansion_key".to_owned(),
1433
1434                // Special table. Ignore it.
1435                "models_building/cs2_file".to_owned(),
1436
1437                "names/nobility".to_owned(),
1438                "names_groups/Description".to_owned(),
1439                "names_groups/ID".to_owned(),
1440                "names_groups/game_expansion_key".to_owned(),
1441                "pdlc/game_expansion_key".to_owned(),
1442                "projectiles/game_expansion_key".to_owned(),
1443                "regions/in_encyclopedia".to_owned(),
1444                "regions/is_sea".to_owned(),
1445                "start_pos_calendars/unique".to_owned(),
1446                "start_pos_character_to_settlements/unique".to_owned(),
1447                "start_pos_factions/unique".to_owned(),
1448                "start_pos_family_relationships/unique".to_owned(),
1449                "start_pos_past_events/unique".to_owned(),
1450                "start_pos_region_religions/unique".to_owned(),
1451                "start_pos_region_slot_templates/unique".to_owned(),
1452                "start_pos_regions/unique".to_owned(),
1453                "start_pos_settlements/unique".to_owned(),
1454                "start_pos_technologies/unique".to_owned(),
1455                "start_pos_victory_conditions/unique".to_owned(),
1456                "taxes_effects_jct/ai_only".to_owned(),
1457                "technologies/in_encyclopedia".to_owned(),
1458                "trigger_events/from_ui".to_owned(),
1459                "trigger_events/game_expansion_key".to_owned(),
1460                "warscape_animated/game_expansion_key".to_owned(),
1461            ],
1462            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
1463            compression_formats_supported: vec![
1464                CompressionFormat::Lzma1
1465            ],
1466            max_cs2_parsed_version: 0
1467        });
1468
1469        // Warhammer 2
1470        game_list.insert(KEY_WARHAMMER_2, GameInfo {
1471            key: KEY_WARHAMMER_2,
1472            display_name: DISPLAY_NAME_WARHAMMER_2,
1473            pfh_versions: {
1474                let mut data = HashMap::new();
1475                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
1476                data.insert(PFHFileType::Release, PFHVersion::PFH5);
1477                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
1478                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
1479                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
1480                data
1481            },
1482            schema_file_name: "schema_wh2.ron".to_owned(),
1483            dependencies_cache_file_name: "wh2.pak2".to_owned(),
1484            raw_db_version: 2,
1485            portrait_settings_version: None,
1486            supports_editing: true,
1487            db_tables_have_guid: true,
1488            locale_file_name: Some("language.txt".to_owned()),
1489            banned_packedfiles: vec![],
1490            icon_small: "gs_wh2.png".to_owned(),
1491            icon_big: "gs_big_wh2.png".to_owned(),
1492            vanilla_db_table_name_logic: VanillaDBTableNameLogic::DefaultName("data__".to_owned()),
1493            install_data: {
1494                let mut data = HashMap::new();
1495                data.insert(InstallType::WinSteam, InstallData {
1496                    vanilla_packs: vec![
1497                        "audio_base.pack".to_owned(),
1498                        "audio_base_2.pack".to_owned(),
1499                        "audio_base_bl.pack".to_owned(),
1500                        "audio_base_br.pack".to_owned(),
1501                        "audio_base_cst.pack".to_owned(),
1502                        "audio_base_m.pack".to_owned(),
1503                        "audio_base_tk.pack".to_owned(),
1504
1505                        // English -- Needs to go first so others can overwrite it, because only a few languages have audio files.
1506                        "audio_en.pack".to_owned(),
1507                        "audio_en_2.pack".to_owned(),
1508                        "audio_en_br.pack".to_owned(),
1509                        "audio_en_cst.pack".to_owned(),
1510                        "audio_en_tk.pack".to_owned(),
1511
1512                        // Brazilian - No audio.
1513                        // Czech - No audio.
1514
1515                        // German
1516                        "audio_ge.pack".to_owned(),
1517                        "audio_ge_2.pack".to_owned(),
1518                        "audio_ge_bm.pack".to_owned(),
1519                        "audio_ge_br.pack".to_owned(),
1520                        "audio_ge_cst.pack".to_owned(),
1521                        "audio_ge_tk.pack".to_owned(),
1522                        "audio_ge_we.pack".to_owned(),
1523
1524                        // Spanish
1525                        "audio_sp.pack".to_owned(),
1526                        "audio_sp_2.pack".to_owned(),
1527                        "audio_sp_bm.pack".to_owned(),
1528                        "audio_sp_br.pack".to_owned(),
1529                        "audio_sp_cst.pack".to_owned(),
1530                        "audio_sp_tk.pack".to_owned(),
1531                        "audio_sp_we.pack".to_owned(),
1532
1533                        // French
1534                        "audio_fr.pack".to_owned(),
1535                        "audio_fr_2.pack".to_owned(),
1536                        "audio_fr_bm.pack".to_owned(),
1537                        "audio_fr_br.pack".to_owned(),
1538                        "audio_fr_cst.pack".to_owned(),
1539                        "audio_fr_tk.pack".to_owned(),
1540                        "audio_fr_we.pack".to_owned(),
1541
1542                        // Italian
1543                        "audio_it.pack".to_owned(),
1544                        "audio_it_2.pack".to_owned(),
1545                        "audio_it_bm.pack".to_owned(),
1546                        "audio_it_br.pack".to_owned(),
1547                        "audio_it_cst.pack".to_owned(),
1548                        "audio_it_tk.pack".to_owned(),
1549                        "audio_it_we.pack".to_owned(),
1550
1551                        // Korean - No audio.
1552
1553                        // Polish
1554                        "audio_pl.pack".to_owned(),
1555                        "audio_pl_2.pack".to_owned(),
1556                        "audio_pl_bm.pack".to_owned(),
1557                        "audio_pl_br.pack".to_owned(),
1558                        "audio_pl_cst.pack".to_owned(),
1559                        "audio_pl_tk.pack".to_owned(),
1560                        "audio_pl_we.pack".to_owned(),
1561
1562                        // Russian
1563                        "audio_ru.pack".to_owned(),
1564                        "audio_ru_2.pack".to_owned(),
1565                        "audio_ru_bm.pack".to_owned(),
1566                        "audio_ru_br.pack".to_owned(),
1567                        "audio_ru_cst.pack".to_owned(),
1568                        "audio_ru_tk.pack".to_owned(),
1569                        "audio_ru_we.pack".to_owned(),
1570
1571                        // Turkish - No audio
1572                        // Simplified Chinese - No audio
1573                        // Traditional Chinese - No audio
1574
1575                        "boot.pack".to_owned(),
1576                        "campaign_variants.pack".to_owned(),
1577                        "campaign_variants_2.pack".to_owned(),
1578                        "campaign_variants_bl.pack".to_owned(),
1579                        "campaign_variants_pro09_.pack".to_owned(),
1580                        "campaign_variants_sb.pack".to_owned(),
1581                        "campaign_variants_sf.pack".to_owned(),
1582                        "campaign_variants_twa02_.pack".to_owned(),
1583                        "campaign_variants_wp_.pack".to_owned(),
1584                        "data.pack".to_owned(),
1585                        "data_1.pack".to_owned(),
1586                        "data_2.pack".to_owned(),
1587                        "data_bl.pack".to_owned(),
1588                        "data_bm.pack".to_owned(),
1589                        "data_gc.pack".to_owned(),
1590                        "data_hb.pack".to_owned(),
1591                        "data_pro09_.pack".to_owned(),
1592                        "data_pw.pack".to_owned(),
1593                        "data_sb.pack".to_owned(),
1594                        "data_sc.pack".to_owned(),
1595                        "data_sf.pack".to_owned(),
1596                        "data_tk.pack".to_owned(),
1597                        "data_twa01_.pack".to_owned(),
1598                        "data_twa02_.pack".to_owned(),
1599                        "data_we.pack".to_owned(),
1600                        "data_wp_.pack".to_owned(),
1601
1602                        "local_en.pack".to_owned(),     // English
1603                        "local_br.pack".to_owned(),     // Brazilian
1604                        "local_cz.pack".to_owned(),     // Czech
1605                        "local_ge.pack".to_owned(),     // German
1606                        "local_sp.pack".to_owned(),     // Spanish
1607                        "local_fr.pack".to_owned(),     // French
1608                        "local_it.pack".to_owned(),     // Italian
1609                        "local_kr.pack".to_owned(),     // Korean
1610                        "local_pl.pack".to_owned(),     // Polish
1611                        "local_ru.pack".to_owned(),     // Russian
1612                        "local_tr.pack".to_owned(),     // Turkish
1613                        "local_cn.pack".to_owned(),     // Simplified Chinese
1614                        "local_zh.pack".to_owned(),     // Traditional Chinese
1615
1616                        "local_en_2.pack".to_owned(),     // English
1617                        "local_br_2.pack".to_owned(),     // Brazilian
1618                        "local_cz_2.pack".to_owned(),     // Czech
1619                        "local_ge_2.pack".to_owned(),     // German
1620                        "local_sp_2.pack".to_owned(),     // Spanish
1621                        "local_fr_2.pack".to_owned(),     // French
1622                        "local_it_2.pack".to_owned(),     // Italian
1623                        "local_kr_2.pack".to_owned(),     // Korean
1624                        "local_pl_2.pack".to_owned(),     // Polish
1625                        "local_ru_2.pack".to_owned(),     // Russian
1626                        "local_tr_2.pack".to_owned(),     // Turkish
1627                        "local_cn_2.pack".to_owned(),     // Simplified Chinese
1628                        "local_zh_2.pack".to_owned(),     // Traditional Chinese
1629
1630                        "local_en_gc.pack".to_owned(),     // English
1631                        "local_br_gc.pack".to_owned(),     // Brazilian
1632                        "local_cz_gc.pack".to_owned(),     // Czech
1633                        "local_ge_gc.pack".to_owned(),     // German
1634                        "local_sp_gc.pack".to_owned(),     // Spanish
1635                        "local_fr_gc.pack".to_owned(),     // French
1636                        "local_it_gc.pack".to_owned(),     // Italian
1637                        "local_kr_gc.pack".to_owned(),     // Korean
1638                        "local_pl_gc.pack".to_owned(),     // Polish
1639                        "local_ru_gc.pack".to_owned(),     // Russian
1640                        "local_tr_gc.pack".to_owned(),     // Turkish
1641                        "local_cn_gc.pack".to_owned(),     // Simplified Chinese
1642                        "local_zh_gc.pack".to_owned(),     // Traditional Chinese
1643
1644                        "models.pack".to_owned(),
1645                        "models_2.pack".to_owned(),
1646                        "models_gc.pack".to_owned(),
1647                        "models2.pack".to_owned(),
1648                        "models2_2.pack".to_owned(),
1649                        "models2_gc.pack".to_owned(),
1650                        "movies.pack".to_owned(),
1651                        "movies_2.pack".to_owned(),
1652                        "movies_sf.pack".to_owned(),
1653                        "movies2.pack".to_owned(),
1654                        "movies3.pack".to_owned(),
1655                        "shaders.pack".to_owned(),
1656                        "shaders_bl.pack".to_owned(),
1657                        "terrain.pack".to_owned(),
1658                        "terrain_2.pack".to_owned(),
1659                        "terrain_gc.pack".to_owned(),
1660                        "terrain2.pack".to_owned(),
1661                        "terrain2_2.pack".to_owned(),
1662                        "terrain2_gc.pack".to_owned(),
1663                        "terrain3.pack".to_owned(),
1664                        "terrain3_2.pack".to_owned(),
1665                        "terrain3_gc.pack".to_owned(),
1666                        "terrain4.pack".to_owned(),
1667                        "terrain4_2.pack".to_owned(),
1668                        "terrain5.pack".to_owned(),
1669                        "terrain7.pack".to_owned(),
1670                        "terrain7_2.pack".to_owned(),
1671                        "terrain7_gc.pack".to_owned(),
1672                        "terrain8.pack".to_owned(),
1673                        "terrain8_2.pack".to_owned(),
1674                        "terrain9.pack".to_owned(),
1675                        "variants.pack".to_owned(),
1676                        "variants_2.pack".to_owned(),
1677                        "variants_bl.pack".to_owned(),
1678                        "variants_dds.pack".to_owned(),
1679                        "variants_dds_2.pack".to_owned(),
1680                        "variants_dds_bl.pack".to_owned(),
1681                        "variants_dds_gc.pack".to_owned(),
1682                        "variants_dds_sb.pack".to_owned(),
1683                        "variants_dds_sf.pack".to_owned(),
1684                        "variants_dds_wp_.pack".to_owned(),
1685                        "variants_dds2.pack".to_owned(),
1686                        "variants_dds2_2.pack".to_owned(),
1687                        "variants_dds2_sb.pack".to_owned(),
1688                        "variants_dds2_sc.pack".to_owned(),
1689                        "variants_dds2_sf_.pack".to_owned(),
1690                        "variants_dds2_wp_.pack".to_owned(),
1691                        "variants_gc.pack".to_owned(),
1692                        "variants_hb.pack".to_owned(),
1693                        "variants_sb.pack".to_owned(),
1694                        "variants_sc.pack".to_owned(),
1695                        "variants_sf_.pack".to_owned(),
1696                        "variants_wp_.pack".to_owned(),
1697                        "warmachines.pack".to_owned(),
1698                        "warmachines_2.pack".to_owned(),
1699                        "warmachines_hb.pack".to_owned(),
1700                    ],
1701                    use_manifest: true,
1702                    store_id: 594_570,
1703                    store_id_ak: 651_460,
1704                    executable: "Warhammer2.exe".to_owned(),
1705                    data_path: "data".to_owned(),
1706                    language_path: "data".to_owned(),
1707                    local_mods_path: "data".to_owned(),
1708                    downloaded_mods_path: "./../../workshop/content/594570".to_owned(),
1709                    config_folder: Some("Warhammer2".to_owned())
1710                });
1711                // TODO: check this, it may have broken with the latest update.
1712                data.insert(InstallType::LnxSteam, InstallData {
1713                    vanilla_packs: vec![
1714                        "audio.pack".to_owned(),
1715                        "audio_2.pack".to_owned(),
1716                        "audio_bl.pack".to_owned(),
1717                        "audio_bm.pack".to_owned(),
1718                        "audio_br.pack".to_owned(),
1719                        "audio_cst.pack".to_owned(),
1720                        "audio_gc.pack".to_owned(),
1721                        "audio_m.pack".to_owned(),
1722                        "audio_tk.pack".to_owned(),
1723                        "audio_we.pack".to_owned(),
1724                        "boot.pack".to_owned(),
1725                        "campaign_variants.pack".to_owned(),
1726                        "campaign_variants_2.pack".to_owned(),
1727                        "campaign_variants_bl.pack".to_owned(),
1728                        "campaign_variants_pro09_.pack".to_owned(),
1729                        "campaign_variants_sb.pack".to_owned(),
1730                        "campaign_variants_sf.pack".to_owned(),
1731                        "campaign_variants_twa02_.pack".to_owned(),
1732                        "campaign_variants_wp_.pack".to_owned(),
1733                        "data.pack".to_owned(),
1734                        "data_1.pack".to_owned(),
1735                        "data_2.pack".to_owned(),
1736                        "data_bl.pack".to_owned(),
1737                        "data_bm.pack".to_owned(),
1738                        "data_gc.pack".to_owned(),
1739                        "data_hb.pack".to_owned(),
1740                        "data_pro09_.pack".to_owned(),
1741                        "data_pw.pack".to_owned(),
1742                        "data_sb.pack".to_owned(),
1743                        "data_sc.pack".to_owned(),
1744                        "data_sf.pack".to_owned(),
1745                        "data_tk.pack".to_owned(),
1746                        "data_twa01_.pack".to_owned(),
1747                        "data_twa02_.pack".to_owned(),
1748                        "data_we.pack".to_owned(),
1749                        "data_wp_.pack".to_owned(),
1750
1751                        "localisation/en/local_en.pack".to_owned(),     // English
1752                        "localisation/br/local_br.pack".to_owned(),     // Brazilian
1753                        "localisation/cz/local_cz.pack".to_owned(),     // Czech
1754                        "localisation/ge/local_ge.pack".to_owned(),     // German
1755                        "localisation/sp/local_sp.pack".to_owned(),     // Spanish
1756                        "localisation/fr/local_fr.pack".to_owned(),     // French
1757                        "localisation/it/local_it.pack".to_owned(),     // Italian
1758                        "localisation/kr/local_kr.pack".to_owned(),     // Korean
1759                        "localisation/pl/local_pl.pack".to_owned(),     // Polish
1760                        "localisation/ru/local_ru.pack".to_owned(),     // Russian
1761                        "localisation/tr/local_tr.pack".to_owned(),     // Turkish
1762                        "localisation/cn/local_cn.pack".to_owned(),     // Simplified Chinese
1763                        "localisation/zh/local_zh.pack".to_owned(),     // Traditional Chinese
1764
1765                        "localisation/en/local_en_2.pack".to_owned(),     // English
1766                        "localisation/br/local_br_2.pack".to_owned(),     // Brazilian
1767                        "localisation/cz/local_cz_2.pack".to_owned(),     // Czech
1768                        "localisation/ge/local_ge_2.pack".to_owned(),     // German
1769                        "localisation/sp/local_sp_2.pack".to_owned(),     // Spanish
1770                        "localisation/fr/local_fr_2.pack".to_owned(),     // French
1771                        "localisation/it/local_it_2.pack".to_owned(),     // Italian
1772                        "localisation/kr/local_kr_2.pack".to_owned(),     // Korean
1773                        "localisation/pl/local_pl_2.pack".to_owned(),     // Polish
1774                        "localisation/ru/local_ru_2.pack".to_owned(),     // Russian
1775                        "localisation/tr/local_tr_2.pack".to_owned(),     // Turkish
1776                        "localisation/cn/local_cn_2.pack".to_owned(),     // Simplified Chinese
1777                        "localisation/zh/local_zh_2.pack".to_owned(),     // Traditional Chinese
1778
1779                        "localisation/en/local_en_gc.pack".to_owned(),     // English
1780                        "localisation/br/local_br_gc.pack".to_owned(),     // Brazilian
1781                        "localisation/cz/local_cz_gc.pack".to_owned(),     // Czech
1782                        "localisation/ge/local_ge_gc.pack".to_owned(),     // German
1783                        "localisation/sp/local_sp_gc.pack".to_owned(),     // Spanish
1784                        "localisation/fr/local_fr_gc.pack".to_owned(),     // French
1785                        "localisation/it/local_it_gc.pack".to_owned(),     // Italian
1786                        "localisation/kr/local_kr_gc.pack".to_owned(),     // Korean
1787                        "localisation/pl/local_pl_gc.pack".to_owned(),     // Polish
1788                        "localisation/ru/local_ru_gc.pack".to_owned(),     // Russian
1789                        "localisation/tr/local_tr_gc.pack".to_owned(),     // Turkish
1790                        "localisation/cn/local_cn_gc.pack".to_owned(),     // Simplified Chinese
1791                        "localisation/zh/local_zh_gc.pack".to_owned(),     // Traditional Chinese
1792
1793                        "models.pack".to_owned(),
1794                        "models_2.pack".to_owned(),
1795                        "models_gc.pack".to_owned(),
1796                        "models2.pack".to_owned(),
1797                        "models2_2.pack".to_owned(),
1798                        "models2_gc.pack".to_owned(),
1799                        "movies.pack".to_owned(),
1800                        "movies_2.pack".to_owned(),
1801                        "movies_sf.pack".to_owned(),
1802                        "movies2.pack".to_owned(),
1803                        "movies3.pack".to_owned(),
1804                        "shaders.pack".to_owned(),
1805                        "shaders_bl.pack".to_owned(),
1806                        "terrain.pack".to_owned(),
1807                        "terrain_2.pack".to_owned(),
1808                        "terrain_gc.pack".to_owned(),
1809                        "terrain2.pack".to_owned(),
1810                        "terrain2_2.pack".to_owned(),
1811                        "terrain2_gc.pack".to_owned(),
1812                        "terrain3.pack".to_owned(),
1813                        "terrain3_2.pack".to_owned(),
1814                        "terrain3_gc.pack".to_owned(),
1815                        "terrain4.pack".to_owned(),
1816                        "terrain4_2.pack".to_owned(),
1817                        "terrain5.pack".to_owned(),
1818                        "terrain7.pack".to_owned(),
1819                        "terrain7_2.pack".to_owned(),
1820                        "terrain7_gc.pack".to_owned(),
1821                        "terrain8.pack".to_owned(),
1822                        "terrain8_2.pack".to_owned(),
1823                        "terrain9.pack".to_owned(),
1824                        "variants.pack".to_owned(),
1825                        "variants_2.pack".to_owned(),
1826                        "variants_bl.pack".to_owned(),
1827                        "variants_dds.pack".to_owned(),
1828                        "variants_dds_2.pack".to_owned(),
1829                        "variants_dds_bl.pack".to_owned(),
1830                        "variants_dds_gc.pack".to_owned(),
1831                        "variants_dds_sb.pack".to_owned(),
1832                        "variants_dds_sf.pack".to_owned(),
1833                        "variants_dds_wp_.pack".to_owned(),
1834                        "variants_dds2.pack".to_owned(),
1835                        "variants_dds2_2.pack".to_owned(),
1836                        "variants_dds2_sb.pack".to_owned(),
1837                        "variants_dds2_sc.pack".to_owned(),
1838                        "variants_dds2_sf_.pack".to_owned(),
1839                        "variants_dds2_wp_.pack".to_owned(),
1840                        "variants_gc.pack".to_owned(),
1841                        "variants_hb.pack".to_owned(),
1842                        "variants_sb.pack".to_owned(),
1843                        "variants_sc.pack".to_owned(),
1844                        "variants_sf_.pack".to_owned(),
1845                        "variants_wp_.pack".to_owned(),
1846                        "warmachines.pack".to_owned(),
1847                        "warmachines_2.pack".to_owned(),
1848                        "warmachines_hb.pack".to_owned(),
1849                    ],
1850                    use_manifest: false,
1851                    store_id: 594_570,
1852                    store_id_ak: 651_460,
1853                    executable: "TotalWarhammer2.sh".to_owned(),
1854                    data_path: "share/data/data".to_owned(),
1855                    language_path: "share/data/data/localisation".to_owned(),
1856                    local_mods_path: "share/data/data".to_owned(),
1857                    downloaded_mods_path: "./../../workshop/content/594570".to_owned(),
1858                    config_folder: None,
1859                });
1860
1861                data
1862            },
1863            tool_vars: {
1864                let mut vars = HashMap::new();
1865                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
1866                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
1867                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
1868
1869                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
1870                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
1871                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
1872                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
1873                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
1874                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
1875                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
1876
1877                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
1878                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
1879                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
1880                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
1881                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
1882                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
1883                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
1884                vars
1885            },
1886            lua_autogen_folder: None,
1887            ak_lost_fields: vec![
1888                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
1889                "_kv_experience_bonuses/description".to_owned(),
1890                "_kv_fatigue/description".to_owned(),
1891                "_kv_fire_values/description".to_owned(),
1892                "_kv_key_buildings/description".to_owned(),
1893                "_kv_morale/description".to_owned(),
1894                "_kv_naval_morale/description".to_owned(),
1895                "_kv_naval_rules/description".to_owned(),
1896                "_kv_rules/description".to_owned(),
1897                "_kv_ui_tweakers/description".to_owned(),
1898                "_kv_unit_ability_scaling_rules/description".to_owned(),
1899                "_kv_winds_of_magic_params/description".to_owned(),
1900                "achievements/game_expansion_key".to_owned(),
1901                "advice_levels/locatable".to_owned(),
1902                "ancillary_info/author".to_owned(),
1903                "ancillary_info/comment".to_owned(),
1904                "ancillary_info/historical_example".to_owned(),
1905                "audio_entity_types/game_expansion_key".to_owned(),
1906                "audio_markers/colour_blue".to_owned(),
1907                "audio_markers/colour_green".to_owned(),
1908                "audio_markers/colour_red".to_owned(),
1909                "audio_metadata_tags/colour_blue".to_owned(),
1910                "audio_metadata_tags/colour_green".to_owned(),
1911                "audio_metadata_tags/colour_red".to_owned(),
1912                "audio_metadata_tags/game_expansion_key".to_owned(),
1913                "audio_metadata_tags/path".to_owned(),
1914                "battle_animations_table/game_expansion_key".to_owned(),
1915                "battle_personalities/game_expansion_key".to_owned(),
1916                "battle_set_pieces/game_expansion_key".to_owned(),
1917                "battle_skeletons/game_expansion_key".to_owned(),
1918                "battles/game_expansion_key".to_owned(),
1919                "battles/objectives_team_1".to_owned(),
1920                "battles/objectives_team_2".to_owned(),
1921                "building_chains/encyclopedia_group".to_owned(),
1922                "building_chains/encyclopedia_include_in_index".to_owned(),
1923                "building_culture_variants/flavour".to_owned(),
1924                "building_levels/commodity_vol".to_owned(),
1925                "campaign_ai_managers/description".to_owned(),
1926                "campaign_map_playable_areas/game_expansion_key".to_owned(),
1927                "campaign_map_playable_areas/maxy".to_owned(),
1928                "campaign_map_playable_areas/miny".to_owned(),
1929                "campaign_map_playable_areas/preview_border".to_owned(),
1930                "campaign_payload_ui_details/comment".to_owned(),
1931                "campaign_settlement_display_building_ids/sub_culture".to_owned(),
1932                "campaign_tree_types/game_expansion_key".to_owned(),
1933                "campaign_variables/description".to_owned(),
1934                "campaigns/game_expansion_key".to_owned(),
1935                "cdir_events_mission_option_junctions/game_expansion_key".to_owned(),
1936                "cdir_military_generator_configs/game_expansion_key".to_owned(),
1937                "cdir_military_generator_templates/game_expansion_key".to_owned(),
1938                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
1939                "character_skills/pre_battle_speech_parameter".to_owned(),
1940                "character_traits/author".to_owned(),
1941                "character_traits/comment".to_owned(),
1942                "deployables/icon_name".to_owned(),
1943                "diplomatic_relations_religion/relations_modifier".to_owned(),
1944                "faction_groups/ui_icon".to_owned(),
1945                "factions/game_expansion_key".to_owned(),
1946                "frontend_faction_leaders/game_expansion_key".to_owned(),
1947                "government_types/elected_ministers".to_owned(),
1948                "government_types/hereditary_ministers".to_owned(),
1949                "government_types/rank".to_owned(),
1950                "land_units/game_expansion_key".to_owned(),
1951                "loading_screen_quotes/game_expansion_key".to_owned(),
1952                "mercenary_pool_to_groups_junctions/game_expansion_key".to_owned(),
1953
1954                // Special table. Ignore them.
1955                "models_building/cs2_file".to_owned(),
1956                "models_building/model_file".to_owned(),
1957                "models_building/tech_file".to_owned(),
1958
1959                "names/nobility".to_owned(),
1960                "names_groups/Description".to_owned(),
1961                "names_groups/ID".to_owned(),
1962                "names_groups/game_expansion_key".to_owned(),
1963                "pdlc/game_expansion_key".to_owned(),
1964                "projectiles/game_expansion_key".to_owned(),
1965                "regions/in_encyclopedia".to_owned(),
1966                "regions/is_sea".to_owned(),
1967                "ritual_chains/description".to_owned(),
1968                "scripted_objectives/game_expansion_key".to_owned(),
1969                "start_pos_calendars/unique".to_owned(),
1970                "start_pos_character_ancillaries/unique".to_owned(),
1971                "start_pos_character_to_settlements/unique".to_owned(),
1972                "start_pos_character_traits/unique".to_owned(),
1973                "start_pos_diplomacy/relations_modifier".to_owned(),
1974                "start_pos_diplomacy/unique".to_owned(),
1975                "start_pos_faction_effect_bundles/unique".to_owned(),
1976                "start_pos_factions/unique".to_owned(),
1977                "start_pos_family_relationships/unique".to_owned(),
1978                "start_pos_land_units/unique".to_owned(),
1979                "start_pos_naval_units/unique".to_owned(),
1980                "start_pos_past_events/unique".to_owned(),
1981                "start_pos_region_religions/unique".to_owned(),
1982                "start_pos_region_slot_templates/unique".to_owned(),
1983                "start_pos_regions/unique".to_owned(),
1984                "start_pos_regions_to_unit_resources/unique".to_owned(),
1985                "start_pos_settlement_garrisons/unique".to_owned(),
1986                "start_pos_settlements/unique".to_owned(),
1987                "start_pos_technologies/unique".to_owned(),
1988                "start_pos_victory_conditions/unique".to_owned(),
1989                "technologies/in_encyclopedia".to_owned(),
1990                "technology_node_sets/game_expansion_key".to_owned(),
1991                "trait_info/applicable_to".to_owned(),
1992                "trigger_events/from_ui".to_owned(),
1993                "trigger_events/game_expansion_key".to_owned(),
1994                "videos/game_expansion_key".to_owned(),
1995                "warscape_animated/game_expansion_key".to_owned(),
1996            ],
1997            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
1998            compression_formats_supported: vec![
1999                CompressionFormat::Lzma1
2000            ],
2001            max_cs2_parsed_version: 0
2002        });
2003
2004        // Warhammer
2005        game_list.insert(KEY_WARHAMMER, GameInfo {
2006            key: KEY_WARHAMMER,
2007            display_name: DISPLAY_NAME_WARHAMMER,
2008            pfh_versions: {
2009                let mut data = HashMap::new();
2010                data.insert(PFHFileType::Boot, PFHVersion::PFH4);
2011                data.insert(PFHFileType::Release, PFHVersion::PFH4);
2012                data.insert(PFHFileType::Patch, PFHVersion::PFH4);
2013                data.insert(PFHFileType::Mod, PFHVersion::PFH4);
2014                data.insert(PFHFileType::Movie, PFHVersion::PFH4);
2015                data
2016            },
2017            schema_file_name: "schema_wh.ron".to_owned(),
2018            dependencies_cache_file_name: "wh.pak2".to_owned(),
2019            raw_db_version: 2,
2020            portrait_settings_version: None,
2021            supports_editing: true,
2022            db_tables_have_guid: true,
2023            locale_file_name: Some("language.txt".to_owned()),
2024            banned_packedfiles: vec![],
2025            icon_small: "gs_wh.png".to_owned(),
2026            icon_big: "gs_big_wh.png".to_owned(),
2027            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
2028            install_data: {
2029                let mut data = HashMap::new();
2030                data.insert(InstallType::WinSteam, InstallData {
2031                    vanilla_packs: vec![],
2032                    use_manifest: true,
2033                    store_id: 364_360,
2034                    store_id_ak: 463_690,
2035                    executable: "Warhammer.exe".to_owned(),
2036                    data_path: "data".to_owned(),
2037                    language_path: "data".to_owned(),
2038                    local_mods_path: "data".to_owned(),
2039                    downloaded_mods_path: "./../../workshop/content/364360".to_owned(),
2040                    config_folder: Some("Warhammer".to_owned())
2041                });
2042
2043                data.insert(InstallType::LnxSteam, InstallData {
2044                    vanilla_packs: vec![
2045                        "boot.pack".to_owned(),
2046                        "data.pack".to_owned(),
2047                        "data_bl.pack".to_owned(),
2048                        "data_bm.pack".to_owned(),
2049                        "data_ch.pack".to_owned(),
2050                        "data_m.pack".to_owned(),
2051                        "data_no.pack".to_owned(),
2052                        "data_we.pack".to_owned(),
2053                        "data_we_m.pack".to_owned(),
2054
2055                        "localisation/local_en.pack".to_owned(),     // English
2056                        "localisation/local_br.pack".to_owned(),     // Brazilian
2057                        "localisation/local_cz.pack".to_owned(),     // Czech
2058                        "localisation/local_ge.pack".to_owned(),     // German
2059                        "localisation/local_sp.pack".to_owned(),     // Spanish
2060                        "localisation/local_fr.pack".to_owned(),     // French
2061                        "localisation/local_it.pack".to_owned(),     // Italian
2062                        "localisation/local_kr.pack".to_owned(),     // Korean
2063                        "localisation/local_pl.pack".to_owned(),     // Polish
2064                        "localisation/local_ru.pack".to_owned(),     // Russian
2065                        "localisation/local_tr.pack".to_owned(),     // Turkish
2066                        "localisation/local_cn.pack".to_owned(),     // Simplified Chinese
2067                        "localisation/local_zh.pack".to_owned(),     // Traditional Chinese
2068
2069                        "localisation/local_en_bl.pack".to_owned(),     // English
2070                        "localisation/local_br_bl.pack".to_owned(),     // Brazilian
2071                        "localisation/local_cz_bl.pack".to_owned(),     // Czech
2072                        "localisation/local_ge_bl.pack".to_owned(),     // German
2073                        "localisation/local_sp_bl.pack".to_owned(),     // Spanish
2074                        "localisation/local_fr_bl.pack".to_owned(),     // French
2075                        "localisation/local_it_bl.pack".to_owned(),     // Italian
2076                        "localisation/local_kr_bl.pack".to_owned(),     // Korean
2077                        "localisation/local_pl_bl.pack".to_owned(),     // Polish
2078                        "localisation/local_ru_bl.pack".to_owned(),     // Russian
2079                        "localisation/local_tr_bl.pack".to_owned(),     // Turkish
2080                        "localisation/local_cn_bl.pack".to_owned(),     // Simplified Chinese
2081                        "localisation/local_zh_bl.pack".to_owned(),     // Traditional Chinese
2082
2083                        "localisation/local_en_bm.pack".to_owned(),     // English
2084                        "localisation/local_br_bm.pack".to_owned(),     // Brazilian
2085                        "localisation/local_cz_bm.pack".to_owned(),     // Czech
2086                        "localisation/local_ge_bm.pack".to_owned(),     // German
2087                        "localisation/local_sp_bm.pack".to_owned(),     // Spanish
2088                        "localisation/local_fr_bm.pack".to_owned(),     // French
2089                        "localisation/local_it_bm.pack".to_owned(),     // Italian
2090                        "localisation/local_kr_bm.pack".to_owned(),     // Korean
2091                        "localisation/local_pl_bm.pack".to_owned(),     // Polish
2092                        "localisation/local_ru_bm.pack".to_owned(),     // Russian
2093                        "localisation/local_tr_bm.pack".to_owned(),     // Turkish
2094                        "localisation/local_cn_bm.pack".to_owned(),     // Simplified Chinese
2095                        "localisation/local_zh_bm.pack".to_owned(),     // Traditional Chinese
2096
2097                        "localisation/local_en_we.pack".to_owned(),     // English
2098                        "localisation/local_br_we.pack".to_owned(),     // Brazilian
2099                        "localisation/local_cz_we.pack".to_owned(),     // Czech
2100                        "localisation/local_ge_we.pack".to_owned(),     // German
2101                        "localisation/local_sp_we.pack".to_owned(),     // Spanish
2102                        "localisation/local_fr_we.pack".to_owned(),     // French
2103                        "localisation/local_it_we.pack".to_owned(),     // Italian
2104                        "localisation/local_kr_we.pack".to_owned(),     // Korean
2105                        "localisation/local_pl_we.pack".to_owned(),     // Polish
2106                        "localisation/local_ru_we.pack".to_owned(),     // Russian
2107                        "localisation/local_tr_we.pack".to_owned(),     // Turkish
2108                        "localisation/local_cn_we.pack".to_owned(),     // Simplified Chinese
2109                        "localisation/local_zh_we.pack".to_owned(),     // Traditional Chinese
2110
2111                        "models.pack".to_owned(),
2112                        "movies.pack".to_owned(),
2113                        "shaders.pack".to_owned(),
2114                        "shaders_bl.pack".to_owned(),
2115                        "terrain.pack".to_owned(),
2116                        "terrain2.pack".to_owned(),
2117                        "terrain3.pack".to_owned(),
2118                        "terrain4.pack".to_owned(),
2119                        "terrain5.pack".to_owned(),
2120                        "terrain6.pack".to_owned(),
2121                        "terrain7.pack".to_owned(),
2122                        "variants.pack".to_owned(),
2123                        "variants_bl.pack".to_owned(),
2124                        "variants_dds.pack".to_owned(),
2125                        "variants_dds_bl.pack".to_owned(),
2126                    ],
2127                    use_manifest: false,
2128                    store_id: 364_360,
2129                    store_id_ak: 463_690,
2130                    executable: "TotalWarhammer.sh".to_owned(),
2131                    data_path: "share/data/data".to_owned(),
2132                    language_path: "share/data/data".to_owned(),
2133                    local_mods_path: "share/data/data".to_owned(),
2134                    downloaded_mods_path: "./../../workshop/content/364360".to_owned(),
2135                    config_folder: None,
2136                });
2137
2138                data
2139            },
2140            tool_vars: {
2141                let mut vars = HashMap::new();
2142                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
2143                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
2144                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
2145
2146                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
2147                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
2148                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
2149                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
2150                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
2151                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
2152                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
2153
2154                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
2155                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
2156                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
2157                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
2158                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
2159                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
2160                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
2161                vars
2162            },
2163            lua_autogen_folder: None,
2164            ak_lost_fields: vec![
2165                "_kv_battle_ai_ability_usage_variables/description".to_owned(),
2166                "_kv_experience_bonuses/description".to_owned(),
2167                "_kv_fatigue/description".to_owned(),
2168                "_kv_fire_values/description".to_owned(),
2169                "_kv_key_buildings/description".to_owned(),
2170                "_kv_morale/description".to_owned(),
2171                "_kv_naval_morale/description".to_owned(),
2172                "_kv_naval_rules/description".to_owned(),
2173                "_kv_rules/description".to_owned(),
2174                "_kv_ui_tweakers/description".to_owned(),
2175                "_kv_unit_ability_scaling_rules/description".to_owned(),
2176                "_kv_winds_of_magic_params/description".to_owned(),
2177                "achievements/game_expansion_key".to_owned(),
2178                "advice_levels/locatable".to_owned(),
2179                "ancillary_info/author".to_owned(),
2180                "ancillary_info/comment".to_owned(),
2181                "ancillary_info/historical_example".to_owned(),
2182                "audio_entity_types/game_expansion_key".to_owned(),
2183                "audio_markers/colour_blue".to_owned(),
2184                "audio_markers/colour_green".to_owned(),
2185                "audio_markers/colour_red".to_owned(),
2186                "audio_metadata_tags/colour_blue".to_owned(),
2187                "audio_metadata_tags/colour_green".to_owned(),
2188                "audio_metadata_tags/colour_red".to_owned(),
2189                "audio_metadata_tags/game_expansion_key".to_owned(),
2190                "audio_metadata_tags/path".to_owned(),
2191                "battle_animations_table/game_expansion_key".to_owned(),
2192                "battle_personalities/game_expansion_key".to_owned(),
2193                "battle_set_pieces/game_expansion_key".to_owned(),
2194                "battle_skeletons/game_expansion_key".to_owned(),
2195                "battles/game_expansion_key".to_owned(),
2196                "battles/objectives_team_1".to_owned(),
2197                "battles/objectives_team_2".to_owned(),
2198                "building_chains/encyclopedia_group".to_owned(),
2199                "building_chains/encyclopedia_include_in_index".to_owned(),
2200                "building_culture_variants/flavour".to_owned(),
2201                "building_levels/commodity_vol".to_owned(),
2202                "campaign_ai_managers/description".to_owned(),
2203                "campaign_map_playable_areas/game_expansion_key".to_owned(),
2204                "campaign_map_playable_areas/maxy".to_owned(),
2205                "campaign_map_playable_areas/miny".to_owned(),
2206                "campaign_map_playable_areas/preview_border".to_owned(),
2207                "campaign_payload_ui_details/comment".to_owned(),
2208                "campaign_settlement_display_building_ids/sub_culture".to_owned(),
2209                "campaign_tree_types/game_expansion_key".to_owned(),
2210                "campaign_variables/description".to_owned(),
2211                "campaigns/game_expansion_key".to_owned(),
2212                "cdir_events_mission_option_junctions/game_expansion_key".to_owned(),
2213                "cdir_military_generator_configs/game_expansion_key".to_owned(),
2214                "cdir_military_generator_templates/game_expansion_key".to_owned(),
2215                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
2216                "character_skills/pre_battle_speech_parameter".to_owned(),
2217                "character_traits/author".to_owned(),
2218                "character_traits/comment".to_owned(),
2219                "deployables/icon_name".to_owned(),
2220                "diplomatic_relations_religion/relations_modifier".to_owned(),
2221                "experience_triggers/condition".to_owned(),
2222                "experience_triggers/event".to_owned(),
2223                "experience_triggers/target".to_owned(),
2224                "faction_groups/ui_icon".to_owned(),
2225                "factions/game_expansion_key".to_owned(),
2226                "frontend_faction_leaders/game_expansion_key".to_owned(),
2227                "government_types/elected_ministers".to_owned(),
2228                "government_types/hereditary_ministers".to_owned(),
2229                "government_types/rank".to_owned(),
2230                "land_units/game_expansion_key".to_owned(),
2231                "loading_screen_quotes/game_expansion_key".to_owned(),
2232                "mercenary_pool_to_groups_junctions/game_expansion_key".to_owned(),
2233                "names/nobility".to_owned(),
2234                "names_groups/Description".to_owned(),
2235                "names_groups/ID".to_owned(),
2236                "names_groups/game_expansion_key".to_owned(),
2237                "pdlc/game_expansion_key".to_owned(),
2238
2239                // Possible case of incorrect definition, but as it's not used by the game, we left it as is.
2240                "plagues/military_force_effects_bundle".to_owned(),
2241                "plagues/region_effect_bundle".to_owned(),
2242
2243                "projectiles/game_expansion_key".to_owned(),
2244                "regions/in_encyclopedia".to_owned(),
2245                "regions/is_sea".to_owned(),
2246                "scripted_objectives/game_expansion_key".to_owned(),
2247                "start_pos_calendars/unique".to_owned(),
2248                "start_pos_character_ancillaries/unique".to_owned(),
2249                "start_pos_character_to_settlements/unique".to_owned(),
2250                "start_pos_character_traits/unique".to_owned(),
2251                "start_pos_diplomacy/relations_modifier".to_owned(),
2252                "start_pos_diplomacy/unique".to_owned(),
2253                "start_pos_factions/unique".to_owned(),
2254                "start_pos_land_units/unique".to_owned(),
2255                "start_pos_past_events/unique".to_owned(),
2256                "start_pos_region_religions/unique".to_owned(),
2257                "start_pos_region_slot_templates/unique".to_owned(),
2258                "start_pos_regions/unique".to_owned(),
2259                "start_pos_settlements/unique".to_owned(),
2260                "start_pos_technologies/unique".to_owned(),
2261                "start_pos_victory_conditions/unique".to_owned(),
2262                "technologies/in_encyclopedia".to_owned(),
2263                "trait_info/applicable_to".to_owned(),
2264                "trigger_effects/game_expansion_key".to_owned(),
2265                "trigger_events/from_ui".to_owned(),
2266                "trigger_events/game_expansion_key".to_owned(),
2267                "warscape_animated/game_expansion_key".to_owned(),
2268            ],
2269            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
2270            compression_formats_supported: vec![],
2271            max_cs2_parsed_version: 0
2272        });
2273
2274        // Thrones of Britannia
2275        game_list.insert(KEY_THRONES_OF_BRITANNIA, GameInfo {
2276            key: KEY_THRONES_OF_BRITANNIA,
2277            display_name: DISPLAY_NAME_THRONES_OF_BRITANNIA,
2278            pfh_versions: {
2279                let mut data = HashMap::new();
2280                data.insert(PFHFileType::Boot, PFHVersion::PFH4);
2281                data.insert(PFHFileType::Release, PFHVersion::PFH4);
2282                data.insert(PFHFileType::Patch, PFHVersion::PFH4);
2283                data.insert(PFHFileType::Mod, PFHVersion::PFH4);
2284                data.insert(PFHFileType::Movie, PFHVersion::PFH4);
2285                data
2286            },
2287            schema_file_name: "schema_tob.ron".to_owned(),
2288            dependencies_cache_file_name: "tob.pak2".to_owned(),
2289            raw_db_version: 2,
2290            portrait_settings_version: None,
2291            supports_editing: true,
2292            db_tables_have_guid: true,
2293            locale_file_name: Some("language.txt".to_owned()),
2294            banned_packedfiles: vec![],
2295            icon_small: "gs_tob.png".to_owned(),
2296            icon_big: "gs_big_tob.png".to_owned(),
2297            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
2298            install_data: {
2299                let mut data = HashMap::new();
2300                data.insert(InstallType::WinSteam, InstallData {
2301                    vanilla_packs: vec![],
2302                    use_manifest: true,
2303                    store_id: 712_100,
2304                    store_id_ak: 817_480,
2305                    executable: "thrones.exe".to_owned(),
2306                    data_path: "data".to_owned(),
2307                    language_path: "data".to_owned(),
2308                    local_mods_path: "data".to_owned(),
2309                    downloaded_mods_path: "./../../workshop/content/712100".to_owned(),
2310                    config_folder: Some("ThronesofBritannia".to_owned())
2311                });
2312
2313                data.insert(InstallType::LnxSteam, InstallData {
2314                    vanilla_packs: vec![
2315                        "blood.pack".to_owned(),
2316                        "boot.pack".to_owned(),
2317                        "data.pack".to_owned(),
2318                        "localisation/en/local_en.pack".to_owned(),     // English
2319                        "localisation/br/local_br.pack".to_owned(),     // Brazilian
2320                        "localisation/cz/local_cz.pack".to_owned(),     // Czech
2321                        "localisation/ge/local_ge.pack".to_owned(),     // German
2322                        "localisation/sp/local_sp.pack".to_owned(),     // Spanish
2323                        "localisation/fr/local_fr.pack".to_owned(),     // French
2324                        "localisation/it/local_it.pack".to_owned(),     // Italian
2325                        "localisation/kr/local_kr.pack".to_owned(),     // Korean
2326                        "localisation/pl/local_pl.pack".to_owned(),     // Polish
2327                        "localisation/ru/local_ru.pack".to_owned(),     // Russian
2328                        "localisation/tr/local_tr.pack".to_owned(),     // Turkish
2329                        "localisation/cn/local_cn.pack".to_owned(),     // Simplified Chinese
2330                        "localisation/zh/local_zh.pack".to_owned(),     // Traditional Chinese
2331                        "models.pack".to_owned(),
2332                        "models2.pack".to_owned(),
2333                        "models3.pack".to_owned(),
2334                        "movies.pack".to_owned(),
2335                        "music.pack".to_owned(),
2336                        "sound.pack".to_owned(),
2337                        "terrain.pack".to_owned(),
2338                        "terrain2.pack".to_owned(),
2339                        "tiles.pack".to_owned(),
2340                        "tiles2.pack".to_owned(),
2341                        "tiles3.pack".to_owned(),
2342                        "tiles4.pack".to_owned(),
2343                        "viking.pack".to_owned(),
2344                    ],
2345                    use_manifest: false,
2346                    store_id: 712_100,
2347                    store_id_ak: 817_480,
2348                    executable: "ThronesOfBritannia.sh".to_owned(),
2349                    data_path: "share/data/data".to_owned(),
2350                    language_path: "share/data/data".to_owned(),
2351                    local_mods_path: "share/data/data".to_owned(),
2352                    downloaded_mods_path: "./../../workshop/content/712100".to_owned(),
2353                    config_folder: None,
2354                });
2355
2356                data
2357            },
2358            tool_vars: {
2359                let mut vars = HashMap::new();
2360                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
2361                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
2362                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
2363
2364                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
2365                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
2366                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
2367                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
2368                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
2369                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
2370                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
2371
2372                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
2373                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
2374                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
2375                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
2376                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
2377                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
2378                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
2379                vars
2380            },
2381            lua_autogen_folder: None,
2382            ak_lost_fields: vec![
2383                "_kv_experience_bonuses/description".to_owned(),
2384                "_kv_fatigue/description".to_owned(),
2385                "_kv_fire_values/description".to_owned(),
2386                "_kv_key_buildings/description".to_owned(),
2387                "_kv_morale/description".to_owned(),
2388                "_kv_naval_morale/description".to_owned(),
2389                "_kv_naval_rules/description".to_owned(),
2390                "_kv_rules/description".to_owned(),
2391
2392                // Possible loc incorrectly marked.
2393                "ancillaries/effect_text".to_owned(),
2394
2395                "ancillary_info/author".to_owned(),
2396                "ancillary_info/comment".to_owned(),
2397                "ancillary_info/historical_example".to_owned(),
2398                "battlefield_building_transformations/description".to_owned(),
2399
2400                // This is due to multiple outdated bob tables in the vanilla packs. It's technically a bug.
2401                "battlefield_buildings/blood_pack_model_override_folder".to_owned(),
2402
2403                "battles/objectives_team_1".to_owned(),
2404                "battles/objectives_team_2".to_owned(),
2405                "building_chains/encyclopedia_group".to_owned(),
2406                "building_chains/encyclopedia_include_in_index".to_owned(),
2407                "building_levels/building_category".to_owned(),
2408                "campaign_ai_managers/description".to_owned(),
2409                "campaign_payload_ui_details/comment".to_owned(),
2410                "campaign_variables/description".to_owned(),
2411                "campaigns/data_directory".to_owned(),
2412
2413                // Possible loc incorrectly marked.
2414                "campaigns/encyclopedia_name_override".to_owned(),
2415
2416                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
2417
2418                // Possible loc incorrectly marked.
2419                "character_trait_levels/effect_text".to_owned(),
2420
2421                "character_traits/author".to_owned(),
2422                "character_traits/comment".to_owned(),
2423                "deployables/in_encyclopaedia".to_owned(),
2424                "encyclopedia_blocks/video".to_owned(),
2425                "experience_triggers/condition".to_owned(),
2426                "experience_triggers/event".to_owned(),
2427                "experience_triggers/target".to_owned(),
2428
2429                // Possible loc, doesn't exist in the ak.
2430                "incident_heading_texts/localised_heading_text".to_owned(),
2431
2432                // Special table, ignore it.
2433                "models_building/cs2_file".to_owned(),
2434                "models_building/logic_file".to_owned(),
2435                "models_building/model_file".to_owned(),
2436
2437                // Special table, ignore it.
2438                "models_sieges/logic_file".to_owned(),
2439
2440                // The table is entry, so no idea if it exists or not..
2441                "mount_variants/key".to_owned(),
2442
2443                "multiplayer_mininum_length_funds/description".to_owned(),
2444                "names/nobility".to_owned(),
2445                "names_groups/Description".to_owned(),
2446                "names_groups/ID".to_owned(),
2447                "projectiles_explosions/non_lethal_detonation".to_owned(),
2448                "regions/in_encyclopedia".to_owned(),
2449                "regions/palette_entry".to_owned(),
2450
2451                // Possible loc, doesn't exist in the ak.
2452                "sound_events/name".to_owned(),
2453
2454                "start_pos_diplomacy/relations_modifier".to_owned(),
2455                "technologies/in_encyclopedia".to_owned(),
2456                "technology_node_links/encyclopedia_child_link_position".to_owned(),
2457                "technology_node_links/encyclopedia_parent_link_position".to_owned(),
2458                "trigger_events/from_ui".to_owned(),
2459                "unit_class/icon".to_owned(),
2460                "warscape_underlay_textures/height".to_owned(),
2461                "warscape_underlay_textures/orientation-angle".to_owned(),
2462                "warscape_underlay_textures/width".to_owned(),
2463            ],
2464            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
2465            compression_formats_supported: vec![],
2466            max_cs2_parsed_version: 13
2467        });
2468
2469        // Attila
2470        game_list.insert(KEY_ATTILA, GameInfo {
2471            key: KEY_ATTILA,
2472            display_name: DISPLAY_NAME_ATTILA,
2473            pfh_versions: {
2474                let mut data = HashMap::new();
2475                data.insert(PFHFileType::Boot, PFHVersion::PFH4);
2476                data.insert(PFHFileType::Release, PFHVersion::PFH4);
2477                data.insert(PFHFileType::Patch, PFHVersion::PFH4);
2478                data.insert(PFHFileType::Mod, PFHVersion::PFH4);
2479                data.insert(PFHFileType::Movie, PFHVersion::PFH4);
2480                data
2481            },
2482            schema_file_name: "schema_att.ron".to_owned(),
2483            dependencies_cache_file_name: "att.pak2".to_owned(),
2484            raw_db_version: 2,
2485            portrait_settings_version: None,
2486            supports_editing: true,
2487            db_tables_have_guid: true,
2488            locale_file_name: Some("language.txt".to_owned()),
2489            banned_packedfiles: vec![],
2490            icon_small: "gs_att.png".to_owned(),
2491            icon_big: "gs_big_att.png".to_owned(),
2492            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
2493            install_data: {
2494                let mut data = HashMap::new();
2495                data.insert(InstallType::WinSteam, InstallData {
2496                    vanilla_packs: vec![
2497                        "belisarius.pack".to_owned(),
2498                        "blood.pack".to_owned(),
2499                        "boot.pack".to_owned(),
2500                        "charlemagne.pack".to_owned(),
2501                        "data.pack".to_owned(),
2502
2503                        "local_en_shared_rome2.pack".to_owned(),    // English, but present for a few more languages. Loads before language-specific packs.
2504
2505                        "local_cz.pack".to_owned(),                 // Czech
2506                        "local_en.pack".to_owned(),                 // English
2507                        "local_fr.pack".to_owned(),                 // French
2508                        "local_ge.pack".to_owned(),                 // German
2509                        "local_it.pack".to_owned(),                 // Italian
2510                        "local_pl.pack".to_owned(),                 // Polish
2511                        "local_ru.pack".to_owned(),                 // Russian
2512                        "local_tr.pack".to_owned(),                 // Turkish
2513                        "local_sp.pack".to_owned(),                 // Spanish
2514
2515                        "models.pack".to_owned(),
2516                        "models2.pack".to_owned(),
2517                        "models3.pack".to_owned(),
2518                        "movies.pack".to_owned(),
2519                        "music.pack".to_owned(),
2520
2521                        "music_en_shared_rome2.pack".to_owned(),    // English, but present for a few more languages. Loads before language-specific packs.
2522
2523                        "music_fr.pack".to_owned(),                 // French
2524                        "music_ge.pack".to_owned(),                 // German
2525                        "music_it.pack".to_owned(),                 // Italian
2526                        "music_ru.pack".to_owned(),                 // Russian
2527                        "music_sp.pack".to_owned(),                 // Spanish
2528
2529                        "slavs.pack".to_owned(),
2530                        "sound.pack".to_owned(),
2531                        "terrain.pack".to_owned(),
2532                        "terrain2.pack".to_owned(),
2533                        "tiles.pack".to_owned(),
2534                        "tiles2.pack".to_owned(),
2535                        "tiles3.pack".to_owned(),
2536                        "tiles4.pack".to_owned(),
2537                    ],
2538                    // The manifest lacks the DLC packs, like charlemagne.pack, so the list above is used instead.
2539                    use_manifest: false,
2540                    store_id: 325_610,
2541                    store_id_ak: 343_660,
2542                    executable: "Attila.exe".to_owned(),
2543                    data_path: "data".to_owned(),
2544                    language_path: "data".to_owned(),
2545                    local_mods_path: "data".to_owned(),
2546                    downloaded_mods_path: "./../../workshop/content/325610".to_owned(),
2547                    config_folder: Some("Attila".to_owned())
2548                });
2549
2550                // Internal linux port, shares structure with the one for Windows.
2551                data.insert(InstallType::LnxSteam, InstallData {
2552                    vanilla_packs: vec![],
2553                    use_manifest: true,
2554                    store_id: 325_610,
2555                    store_id_ak: 343_660,
2556                    executable: "Attila".to_owned(),
2557                    data_path: "data".to_owned(),
2558                    language_path: "data".to_owned(),
2559                    local_mods_path: "data".to_owned(),
2560                    downloaded_mods_path: "./../../workshop/content/325610".to_owned(),
2561                    config_folder: None,
2562                });
2563
2564                data
2565            },
2566            tool_vars: {
2567                let mut vars = HashMap::new();
2568                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
2569                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
2570                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
2571
2572                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
2573                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
2574                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
2575                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
2576                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
2577                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
2578                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
2579
2580                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
2581                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
2582                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
2583                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
2584                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
2585                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
2586                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
2587                vars
2588            },
2589            lua_autogen_folder: None,
2590            ak_lost_fields: vec![
2591                "_kv_experience_bonuses/description".to_owned(),
2592                "_kv_fatigue/description".to_owned(),
2593                "_kv_fire_values/description".to_owned(),
2594                "_kv_key_buildings/description".to_owned(),
2595                "_kv_morale/description".to_owned(),
2596                "_kv_naval_morale/description".to_owned(),
2597                "_kv_naval_rules/description".to_owned(),
2598                "_kv_rules/description".to_owned(),
2599
2600                // Possible loc incorrectly marked.
2601                "ancillaries/effect_text".to_owned(),
2602
2603                "ancillary_info/author".to_owned(),
2604                "ancillary_info/comment".to_owned(),
2605                "ancillary_info/historical_example".to_owned(),
2606                "battlefield_building_transformations/description".to_owned(),
2607
2608                // This is due to multiple outdated bob tables in the vanilla packs. It's technically a bug.
2609                "battlefield_buildings/blood_pack_model_override_folder".to_owned(),
2610
2611                "battles/objectives_team_1".to_owned(),
2612                "battles/objectives_team_2".to_owned(),
2613                "building_chains/encyclopedia_group".to_owned(),
2614                "building_chains/encyclopedia_include_in_index".to_owned(),
2615                "building_levels/building_category".to_owned(),
2616                "campaign_ai_managers/description".to_owned(),
2617                "campaign_payload_ui_details/comment".to_owned(),
2618                "campaign_variables/description".to_owned(),
2619                "campaigns/data_directory".to_owned(),
2620                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
2621
2622                // Possible loc incorrectly marked.
2623                "character_trait_levels/effect_text".to_owned(),
2624
2625                "character_traits/author".to_owned(),
2626                "character_traits/comment".to_owned(),
2627                "deployables/in_encyclopaedia".to_owned(),
2628                "encyclopedia_blocks/video".to_owned(),
2629                "experience_triggers/condition".to_owned(),
2630                "experience_triggers/event".to_owned(),
2631                "experience_triggers/target".to_owned(),
2632
2633                // Possible loc, doesn't exist in the ak.
2634                "incident_heading_texts/localised_heading_text".to_owned(),
2635
2636                // Special table, ignore it.
2637                "models_building/cs2_file".to_owned(),
2638                "models_building/model_file".to_owned(),
2639
2640                // Special table, ignore it.
2641                "models_sieges/display_path".to_owned(),
2642                "models_sieges/logic_file".to_owned(),
2643                "models_sieges/model_file".to_owned(),
2644
2645                "mount_variants/key".to_owned(),
2646                "multiplayer_mininum_length_funds/description".to_owned(),
2647                "names/nobility".to_owned(),
2648                "names_groups/Description".to_owned(),
2649                "names_groups/ID".to_owned(),
2650                "projectiles_explosions/non_lethal_detonation".to_owned(),
2651                "regions/in_encyclopedia".to_owned(),
2652                "regions/palette_entry".to_owned(),
2653
2654                // Possible loc, doesn't exist in the ak.
2655                "sound_events/name".to_owned(),
2656
2657                "start_pos_diplomacy/relations_modifier".to_owned(),
2658                "technologies/in_encyclopedia".to_owned(),
2659                "technology_node_links/encyclopedia_child_link_position".to_owned(),
2660                "technology_node_links/encyclopedia_parent_link_position".to_owned(),
2661                "trigger_events/from_ui".to_owned(),
2662                "unit_class/icon".to_owned(),
2663                "warscape_underlay_textures/height".to_owned(),
2664                "warscape_underlay_textures/orientation-angle".to_owned(),
2665                "warscape_underlay_textures/width".to_owned(),
2666            ],
2667            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
2668            compression_formats_supported: vec![],
2669            max_cs2_parsed_version: 13
2670        });
2671
2672        // Rome 2
2673        game_list.insert(KEY_ROME_2, GameInfo {
2674            key: KEY_ROME_2,
2675            display_name: DISPLAY_NAME_ROME_2,
2676            pfh_versions: {
2677                let mut data = HashMap::new();
2678                data.insert(PFHFileType::Boot, PFHVersion::PFH4);
2679                data.insert(PFHFileType::Release, PFHVersion::PFH4);
2680                data.insert(PFHFileType::Patch, PFHVersion::PFH4);
2681                data.insert(PFHFileType::Mod, PFHVersion::PFH4);
2682                data.insert(PFHFileType::Movie, PFHVersion::PFH4);
2683                data
2684            },
2685            schema_file_name: "schema_rom2.ron".to_owned(),
2686            dependencies_cache_file_name: "rom2.pak2".to_owned(),
2687            raw_db_version: 2,
2688            portrait_settings_version: None,
2689            supports_editing: true,
2690            db_tables_have_guid: true,
2691            locale_file_name: Some("language.txt".to_owned()),
2692            banned_packedfiles: vec![],
2693            icon_small: "gs_rom2.png".to_owned(),
2694            icon_big: "gs_big_rom2.png".to_owned(),
2695            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
2696            install_data: {
2697                let mut data = HashMap::new();
2698                data.insert(InstallType::WinSteam, InstallData {
2699                    vanilla_packs: vec![
2700                        "blood_rome2.pack".to_owned(),
2701                        "boot.pack".to_owned(),
2702                        "data.pack".to_owned(),
2703                        "data_rome2.pack".to_owned(),
2704                        "divided.pack".to_owned(),
2705                        "gaul.pack".to_owned(),
2706                        "greeks.pack".to_owned(),
2707                        "invasion.pack".to_owned(),
2708
2709                        "local_en_shared_rome2.pack".to_owned(),    // English, but present for a few more languages. Loads before language-specific packs.
2710
2711                        "local_cz.pack".to_owned(),                 // Czech
2712                        "local_en.pack".to_owned(),                 // English
2713                        "local_fr.pack".to_owned(),                 // French
2714                        "local_ge.pack".to_owned(),                 // German
2715                        "local_it.pack".to_owned(),                 // Italian
2716                        "local_pl.pack".to_owned(),                 // Polish
2717                        "local_ru.pack".to_owned(),                 // Russian
2718                        "local_tr.pack".to_owned(),                 // Turkish
2719                        "local_sp.pack".to_owned(),                 // Spanish
2720
2721                        "models.pack".to_owned(),
2722                        "models_rome2.pack".to_owned(),
2723                        "models2.pack".to_owned(),
2724                        "models2_rome2.pack".to_owned(),
2725                        "models3_rome2.pack".to_owned(),
2726                        "movies.pack".to_owned(),
2727                        "movies_rome2.pack".to_owned(),
2728                        "music.pack".to_owned(),
2729                        "music_rome2.pack".to_owned(),
2730
2731                        "music_en_shared_rome2.pack".to_owned(),    // English, but present for a few more languages. Loads before language-specific packs.
2732
2733                        "music_fr.pack".to_owned(),                 // French
2734                        "music_ge.pack".to_owned(),                 // German
2735                        "music_it.pack".to_owned(),                 // Italian
2736                        "music_ru.pack".to_owned(),                 // Russian
2737                        "music_sp.pack".to_owned(),                 // Spanish
2738
2739                        "punic.pack".to_owned(),
2740                        "sound.pack".to_owned(),
2741                        "sound_rome2.pack".to_owned(),
2742                        "terrain.pack".to_owned(),
2743                        "terrain_rome2.pack".to_owned(),
2744                        "terrain2.pack".to_owned(),
2745                        "terrain2_rome2.pack".to_owned(),
2746                        "terrain3_rome2.pack".to_owned(),
2747                        "tiles.pack".to_owned(),
2748                        "tiles_rome2.pack".to_owned(),
2749                        "tiles2.pack".to_owned(),
2750                        "tiles2_rome2.pack".to_owned(),
2751                        "tiles3.pack".to_owned(),
2752                        "tiles3_rome2.pack".to_owned(),
2753                        "tiles4.pack".to_owned(),
2754                        "tiles4_rome2.pack".to_owned()
2755                    ],
2756                    use_manifest: false,
2757                    store_id: 214_950,
2758                    store_id_ak: 267_180,
2759                    executable: "Rome2.exe".to_owned(),
2760                    data_path: "data".to_owned(),
2761                    language_path: "data".to_owned(),
2762                    local_mods_path: "data".to_owned(),
2763                    downloaded_mods_path: "./../../workshop/content/214950".to_owned(),
2764                    config_folder: Some("Rome2".to_owned()),
2765                });
2766
2767                data
2768            },
2769            tool_vars: {
2770                let mut vars = HashMap::new();
2771                vars.insert("faction_painter_factions_table_name".to_owned(), "factions_tables".to_owned());
2772                vars.insert("faction_painter_factions_table_definition".to_owned(), "factions_definition".to_owned());
2773                vars.insert("faction_painter_factions_row_key".to_owned(), "faction_row".to_owned());
2774
2775                vars.insert("faction_painter_banner_table_name".to_owned(), "faction_banners_tables".to_owned());
2776                vars.insert("faction_painter_banner_table_definition".to_owned(), "banner_definition".to_owned());
2777                vars.insert("faction_painter_banner_key_column_name".to_owned(), "key".to_owned());
2778                vars.insert("faction_painter_banner_primary_colour_column_name".to_owned(), "primary_hex".to_owned());
2779                vars.insert("faction_painter_banner_secondary_colour_column_name".to_owned(), "secondary_hex".to_owned());
2780                vars.insert("faction_painter_banner_tertiary_colour_column_name".to_owned(), "tertiary_hex".to_owned());
2781                vars.insert("faction_painter_banner_row_key".to_owned(), "banner_row".to_owned());
2782
2783                vars.insert("faction_painter_uniform_table_name".to_owned(), "faction_uniform_colours_tables".to_owned());
2784                vars.insert("faction_painter_uniform_table_definition".to_owned(), "uniform_definition".to_owned());
2785                vars.insert("faction_painter_uniform_key_column_name".to_owned(), "faction_name".to_owned());
2786                vars.insert("faction_painter_uniform_primary_colour_column_name".to_owned(), "primary_colour_hex".to_owned());
2787                vars.insert("faction_painter_uniform_secondary_colour_column_name".to_owned(), "secondary_colour_hex".to_owned());
2788                vars.insert("faction_painter_uniform_tertiary_colour_column_name".to_owned(), "tertiary_colour_hex".to_owned());
2789                vars.insert("faction_painter_uniform_row_key".to_owned(), "uniform_row".to_owned());
2790                vars
2791            },
2792            lua_autogen_folder: None,
2793            ak_lost_fields: vec![
2794                "_kv_experience_bonuses/description".to_owned(),
2795                "_kv_fatigue/description".to_owned(),
2796                "_kv_key_buildings/description".to_owned(),
2797                "_kv_morale/description".to_owned(),
2798                "_kv_naval_morale/description".to_owned(),
2799                "_kv_rules/description".to_owned(),
2800
2801                // Possible loc incorrectly marked.
2802                "ancillaries/effect_text".to_owned(),
2803
2804                "ancillary_info/author".to_owned(),
2805                "ancillary_info/comment".to_owned(),
2806                "ancillary_info/historical_example".to_owned(),
2807
2808                // Weird one. The game uses an older version than the one in the AK,
2809                // which is missing this column. The newly exported one contains it.
2810                "banditry_events/duration".to_owned(),
2811
2812                "battlefield_building_transformations/description".to_owned(),
2813                "battles/objectives_team_1".to_owned(),
2814                "battles/objectives_team_2".to_owned(),
2815                "building_chains/encyclopedia_group".to_owned(),
2816                "building_chains/encyclopedia_include_in_index".to_owned(),
2817                "building_levels/building_category".to_owned(),
2818                "campaign_ai_managers/description".to_owned(),
2819                "campaign_ai_personalities/description".to_owned(),
2820                "campaign_variables/description".to_owned(),
2821                "campaigns/data_directory".to_owned(),
2822                "character_skill_level_to_effects_junctions/is_factionwide".to_owned(),
2823
2824                // Possible loc incorrectly marked.
2825                "character_trait_levels/effect_text".to_owned(),
2826
2827                "character_traits/author".to_owned(),
2828                "character_traits/comment".to_owned(),
2829                "deployables/in_encyclopaedia".to_owned(),
2830                "encyclopedia_blocks/video".to_owned(),
2831                "event_log_descriptions/notes".to_owned(),
2832                "experience_triggers/condition".to_owned(),
2833                "experience_triggers/event".to_owned(),
2834                "experience_triggers/target".to_owned(),
2835
2836                // Possible loc, doesn't exist in the ak.
2837                "incident_heading_texts/localised_heading_text".to_owned(),
2838
2839                "mount_variants/key".to_owned(),
2840                "multiplayer_mininum_length_funds/description".to_owned(),
2841                "names/nobility".to_owned(),
2842                "names_groups/Description".to_owned(),
2843                "names_groups/ID".to_owned(),
2844                "projectiles_explosions/non_lethal_detonation".to_owned(),
2845                "regions/in_encyclopedia".to_owned(),
2846                "regions/palette_entry".to_owned(),
2847
2848                // Possible loc, doesn't exist in the ak.
2849                "sound_events/name".to_owned(),
2850
2851                "start_pos_diplomacy/relations_modifier".to_owned(),
2852                "technologies/in_encyclopedia".to_owned(),
2853                "technology_node_links/encyclopedia_child_link_position".to_owned(),
2854                "technology_node_links/encyclopedia_parent_link_position".to_owned(),
2855                "trigger_events/from_ui".to_owned(),
2856                "warscape_underlay_textures/height".to_owned(),
2857                "warscape_underlay_textures/orientation-angle".to_owned(),
2858                "warscape_underlay_textures/width".to_owned(),
2859            ],
2860            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
2861            compression_formats_supported: vec![],
2862            max_cs2_parsed_version: 11
2863        });
2864
2865        // Shogun 2
2866        game_list.insert(KEY_SHOGUN_2, GameInfo {
2867            key: KEY_SHOGUN_2,
2868            display_name: DISPLAY_NAME_SHOGUN_2,
2869            pfh_versions: {
2870                let mut data = HashMap::new();
2871                data.insert(PFHFileType::Boot, PFHVersion::PFH2);
2872                data.insert(PFHFileType::Release, PFHVersion::PFH2);
2873                data.insert(PFHFileType::Patch, PFHVersion::PFH2);
2874                data.insert(PFHFileType::Mod, PFHVersion::PFH3);
2875                data.insert(PFHFileType::Movie, PFHVersion::PFH2);
2876                data
2877            },
2878            schema_file_name: "schema_sho2.ron".to_owned(),
2879            dependencies_cache_file_name: "sho2.pak2".to_owned(),
2880            raw_db_version: 1,
2881            portrait_settings_version: None,
2882            supports_editing: true,
2883            db_tables_have_guid: true,
2884            locale_file_name: Some("language.txt".to_owned()),
2885            banned_packedfiles: vec![],
2886            icon_small: "gs_sho2.png".to_owned(),
2887            icon_big: "gs_big_sho2.png".to_owned(),
2888            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
2889            install_data: {
2890                let mut data = HashMap::new();
2891                data.insert(InstallType::WinSteam, InstallData {
2892                    vanilla_packs: vec![],
2893                    use_manifest: true,
2894                    store_id: 34_330,
2895                    store_id_ak: 202_930,
2896                    executable: "shogun2.exe".to_owned(),
2897                    data_path: "data".to_owned(),
2898                    language_path: "data".to_owned(),
2899                    local_mods_path: "data".to_owned(),
2900                    downloaded_mods_path: "./../../workshop/content/34330".to_owned(),
2901                    config_folder: Some("Shogun2".to_owned())
2902                });
2903
2904                data.insert(InstallType::LnxSteam, InstallData {
2905                    vanilla_packs: vec![
2906                        "boot.pack".to_owned(),
2907                        "bp_orig.pack".to_owned(),
2908                        "data.pack".to_owned(),
2909                        "localization/local_en.pack".to_owned(),     // English
2910                        "localization/local_br.pack".to_owned(),     // Brazilian
2911                        "localization/local_cz.pack".to_owned(),     // Czech
2912                        "localization/local_ge.pack".to_owned(),     // German
2913                        "localization/local_sp.pack".to_owned(),     // Spanish
2914                        "localization/local_fr.pack".to_owned(),     // French
2915                        "localization/local_it.pack".to_owned(),     // Italian
2916                        "localization/local_kr.pack".to_owned(),     // Korean
2917                        "localization/local_pl.pack".to_owned(),     // Polish
2918                        "localization/local_ru.pack".to_owned(),     // Russian
2919                        "localization/local_tr.pack".to_owned(),     // Turkish
2920                        "localization/local_cn.pack".to_owned(),     // Simplified Chinese
2921                        "localization/local_zh.pack".to_owned(),     // Traditional Chinese
2922                        "models.pack".to_owned(),
2923                        "models2.pack".to_owned(),
2924                        "shaders.pack".to_owned(),
2925                        "sound.pack".to_owned(),
2926                        "terrain.pack".to_owned(),
2927                        "../fots/data_fots.pack".to_owned(),
2928                    ],
2929                    use_manifest: false,
2930                    store_id: 34_330,
2931                    store_id_ak: 202_930,
2932                    executable: "Shogun2.sh".to_owned(),
2933                    data_path: "share/data/data".to_owned(),
2934                    language_path: "share/data/data".to_owned(),
2935                    local_mods_path: "share/data/data".to_owned(),
2936                    downloaded_mods_path: "./../../workshop/content/34330".to_owned(),
2937                    config_folder: None,
2938                });
2939
2940                data
2941            },
2942            tool_vars: HashMap::new(),
2943            lua_autogen_folder: None,
2944            ak_lost_fields: vec![
2945                "_kv_experience_bonuses/description".to_owned(),
2946                "_kv_fatigue/description".to_owned(),
2947                "_kv_key_buildings/description".to_owned(),
2948                "_kv_morale/description".to_owned(),
2949                "_kv_naval_morale/description".to_owned(),
2950                "_kv_rules/description".to_owned(),
2951                "_kv_special_ability_effects/description".to_owned(),
2952                "agents/animation_set".to_owned(),
2953                "agents/associated_unit".to_owned(),
2954                "agents/in_encyclopedia".to_owned(),
2955
2956                // Possible loc incorrectly marked.
2957                "ancillaries/effect_text".to_owned(),
2958
2959                "ancillary_info/author".to_owned(),
2960                "ancillary_info/comment".to_owned(),
2961                "ancillary_info/historical_example".to_owned(),
2962
2963                "avatar_dojos/codependency_key".to_owned(),
2964                "avatar_gempei_dojos/codependency_key".to_owned(),
2965                "avatar_ranks/avatar_naval_unit_cost".to_owned(),
2966                "avatar_unit_group_ids/description".to_owned(),
2967                "avatar_units/anti_spam_cost_increase".to_owned(),
2968                "avatar_units/anti_spam_limit".to_owned(),
2969                "battle_script_strings/game_area".to_owned(),
2970                "battlefield_building_transformations/description".to_owned(),
2971
2972                // Special case. These exist, but due to the game having fragments of this table
2973                // with old version that don't have these columns, they get reported as missing.
2974                "battlefield_buildings/fortwall_penetration_chance".to_owned(),
2975                "battlefield_buildings/radar_icon".to_owned(),
2976                "battlefield_buildings/spawned_unit".to_owned(),
2977                "battlefield_buildings/visible_in_public_ted".to_owned(),
2978
2979                "battles/objectives_team_1".to_owned(),
2980                "battles/objectives_team_2".to_owned(),
2981                "building_levels/building_category".to_owned(),
2982                "campaign_ai_managers/description".to_owned(),
2983                "campaign_ai_personalities/description".to_owned(),
2984                "campaign_map_playable_areas/mapname".to_owned(),
2985                "campaign_map_playable_areas/maxx".to_owned(),
2986                "campaign_map_playable_areas/maxy".to_owned(),
2987                "campaign_map_playable_areas/minx".to_owned(),
2988                "campaign_map_playable_areas/miny".to_owned(),
2989                "campaign_map_towns_and_ports/region".to_owned(),
2990                "campaign_variables/description".to_owned(),
2991                "campaigns/data_directory".to_owned(),
2992                "character_trait_levels/effect_text".to_owned(),
2993                "character_traits/author".to_owned(),
2994                "character_traits/comment".to_owned(),
2995                "event_log_descriptions/notes".to_owned(),
2996                "experience_triggers/condition".to_owned(),
2997                "experience_triggers/event".to_owned(),
2998
2999                // Possible loc, doesn't exist in the ak.
3000                "incident_heading_texts/localised_heading_text".to_owned(),
3001
3002                "mount_variants/key".to_owned(),
3003                "multiplayer_mininum_length_funds/description".to_owned(),
3004                "projectiles/bounce_angle".to_owned(),
3005                "projectiles/preflight_rules".to_owned(),
3006                "projectiles_explosions/non_lethal_detonation".to_owned(),
3007                "regions/in_encyclopedia".to_owned(),
3008                "regions/palette_entry".to_owned(),
3009                "slots_art/underlay_rotation".to_owned(),
3010                "slots_art/underlay_scale".to_owned(),
3011                "start_pos_diplomacy/relations_modifier".to_owned(),
3012                "start_pos_forts/fort_name".to_owned(),
3013                "start_pos_regions/encyclopedia_order".to_owned(),
3014                "technologies/in_encyclopedia".to_owned(),
3015                "trigger_events/from_ui".to_owned(),
3016                "uniforms/IconScreenshotCameraPreset".to_owned(),
3017                "uniforms/InfoScreenshotCameraPreset".to_owned(),
3018                "uniforms/ManAnimation".to_owned(),
3019                "uniforms/MountAnimation".to_owned(),
3020                "unit_stats_land/desert_effect".to_owned(),
3021                "unit_stats_land/snow_effect".to_owned(),
3022                "unit_stats_land/tropics_effect".to_owned(),
3023                "unit_stats_land/unit_class".to_owned(),
3024                "unit_stats_naval/repair_cost_port".to_owned(),
3025                "unit_stats_naval/repair_cost_sea".to_owned(),
3026                "unit_stats_naval/ship_rating_icon".to_owned(),
3027                "units/era".to_owned(),
3028                "units/fitness".to_owned(),
3029                "units/pdlc".to_owned(),
3030                "warscape_underlay_textures/height".to_owned(),
3031                "warscape_underlay_textures/orientation-angle".to_owned(),
3032                "warscape_underlay_textures/width".to_owned(),
3033            ],
3034            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
3035            compression_formats_supported: vec![],
3036            max_cs2_parsed_version: 0
3037        });
3038
3039        // Napoleon
3040        game_list.insert(KEY_NAPOLEON, GameInfo {
3041            key: KEY_NAPOLEON,
3042            display_name: DISPLAY_NAME_NAPOLEON,
3043            pfh_versions: {
3044                let mut data = HashMap::new();
3045                data.insert(PFHFileType::Boot, PFHVersion::PFH0);
3046                data.insert(PFHFileType::Release, PFHVersion::PFH0);
3047                data.insert(PFHFileType::Patch, PFHVersion::PFH0);
3048                data.insert(PFHFileType::Mod, PFHVersion::PFH0);
3049                data.insert(PFHFileType::Movie, PFHVersion::PFH0);
3050                data
3051            },
3052            schema_file_name: "schema_nap.ron".to_owned(),
3053            dependencies_cache_file_name: "nap.pak2".to_owned(),
3054            raw_db_version: 0,
3055            portrait_settings_version: None,
3056            supports_editing: true,
3057            db_tables_have_guid: false,
3058            locale_file_name: Some("language.txt".to_owned()),
3059            banned_packedfiles: vec![],
3060            icon_small: "gs_nap.png".to_owned(),
3061            icon_big: "gs_big_nap.png".to_owned(),
3062            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
3063            install_data: {
3064                let mut data = HashMap::new();
3065                data.insert(InstallType::WinSteam, InstallData {
3066                    vanilla_packs: vec![
3067                        "battleterrain.pack".to_owned(),
3068                        "boot.pack".to_owned(),
3069                        "buildings.pack".to_owned(),
3070                        "data.pack".to_owned(),
3071                        "local_en.pack".to_owned(),         // English
3072                        "local_en_patch.pack".to_owned(),   // English Patch
3073                        "local_br.pack".to_owned(),         // Brazilian
3074                        "local_br_patch.pack".to_owned(),   // Brazilian Patch
3075                        "local_cz.pack".to_owned(),         // Czech
3076                        "local_cz_patch.pack".to_owned(),   // Czech Patch
3077                        "local_ge.pack".to_owned(),         // German
3078                        "local_ge_patch.pack".to_owned(),   // German Patch
3079                        "local_sp.pack".to_owned(),         // Spanish
3080                        "local_sp_patch.pack".to_owned(),   // Spanish Patch
3081                        "local_fr.pack".to_owned(),         // French
3082                        "local_fr_patch.pack".to_owned(),   // French Patch
3083                        "local_it.pack".to_owned(),         // Italian
3084                        "local_it_patch.pack".to_owned(),   // Italian Patch
3085                        "local_kr.pack".to_owned(),         // Korean
3086                        "local_kr_patch.pack".to_owned(),   // Korean Patch
3087                        "local_pl.pack".to_owned(),         // Polish
3088                        "local_pl_patch.pack".to_owned(),   // Polish Patch
3089                        "local_ru.pack".to_owned(),         // Russian
3090                        "local_ru_patch.pack".to_owned(),   // Russian Patch
3091                        "local_tr.pack".to_owned(),         // Turkish
3092                        "local_tr_patch.pack".to_owned(),   // Turkish Patch
3093                        "local_cn.pack".to_owned(),         // Simplified Chinese
3094                        "local_cn_patch.pack".to_owned(),   // Simplified Chinese Patch
3095                        "local_zh.pack".to_owned(),         // Traditional Chinese
3096                        "local_zh_patch.pack".to_owned(),   // Traditional Chinese Patch
3097                        "media.pack".to_owned(),
3098                        "patch.pack".to_owned(),
3099                        "patch_media.pack".to_owned(),
3100                        "patch_media2.pack".to_owned(),
3101                        "patch_media2.pack".to_owned(),
3102                        "patch2.pack".to_owned(),
3103                        "patch3.pack".to_owned(),
3104                        "patch4.pack".to_owned(),
3105                        "patch5.pack".to_owned(),
3106                        "patch6.pack".to_owned(),
3107                        "patch7.pack".to_owned(),
3108                        "rigidmodels.pack".to_owned(),
3109                        "sound.pack".to_owned(),
3110                        "variantmodels.pack".to_owned(),
3111                        "variantmodels2.pack".to_owned(),
3112                    ],
3113                    use_manifest: false,
3114                    store_id: 34_030,
3115                    store_id_ak: 0,
3116                    executable: "Napoleon.exe".to_owned(),
3117                    data_path: "data".to_owned(),
3118                    language_path: "data".to_owned(),
3119                    local_mods_path: "data".to_owned(),
3120                    downloaded_mods_path: "./../../workshop/content/34030".to_owned(),
3121                    config_folder: Some("Napoleon".to_owned()),
3122                });
3123
3124                data
3125            },
3126            tool_vars: HashMap::new(),
3127            lua_autogen_folder: None,
3128            ak_lost_fields: vec![
3129                "_kv_fatigue/Gen_description".to_owned(),
3130                "_kv_morale/description".to_owned(),
3131                "_kv_naval_morale/description".to_owned(),
3132                "_kv_rules/Gen_description".to_owned(),
3133                "abilities/Gen_effect_text".to_owned(),
3134                "abilities/is_active".to_owned(),
3135                "advice_levels/Gen_TempField_x002A_1".to_owned(),
3136                "advice_levels/Gen_TempField_x002A_2".to_owned(),
3137                "advice_levels/Gen_onscreen_text".to_owned(),
3138                "agent_attribute_situations/Gen_effect_text".to_owned(),
3139                "agent_attributes/Gen_effect_text".to_owned(),
3140                "agents/associated_unit".to_owned(),
3141                "ancillaries/Gen_colour_text".to_owned(),
3142                "ancillaries/Gen_effect_text".to_owned(),
3143                "ancillaries/Gen_exclusion_text".to_owned(),
3144                "ancillaries/Gen_explanation_text".to_owned(),
3145                "ancillary_info/Gen_comment".to_owned(),
3146                "ancillary_info/author".to_owned(),
3147                "ancillary_info/historical_example".to_owned(),
3148                "anim_reference_poses/Gen_path".to_owned(),
3149                "battle_personalities/equipment_theme".to_owned(),
3150                "battle_script_strings/game_area".to_owned(),
3151                "battle_weather_types/naval_appropriate".to_owned(),
3152                "battlefield_building_transformations/description".to_owned(),
3153                "battlefield_buildings/onscreen_name".to_owned(),
3154                "battlefield_deployable_siege_items/Gen_string".to_owned(),
3155                "battles/Gen_description".to_owned(),
3156                "battles/Gen_objectives_team_1".to_owned(),
3157                "battles/Gen_objectives_team_2".to_owned(),
3158                "bribe_actions/action".to_owned(),
3159                "bribe_actions/onscreen".to_owned(),
3160                "building_chains/Gen_chain_tooltip".to_owned(),
3161                "building_description_texts/Gen_TempField_x002A_0".to_owned(),
3162                "building_description_texts/Gen_long_description".to_owned(),
3163                "building_levels/Gen_condition".to_owned(),
3164                "building_levels/building_category".to_owned(),
3165                "building_units_allowed/Gen_conditions".to_owned(),
3166                "building_units_allowed/XP".to_owned(),
3167                "campaign_ai_managers/description".to_owned(),
3168                "campaign_ai_personalities/description".to_owned(),
3169                "campaign_anim_transitions/Gen_path".to_owned(),
3170                "campaign_anim_transitions/ID".to_owned(),
3171                "campaign_anims/Gen_path".to_owned(),
3172                "campaign_map_playable_areas/Gen_TempField_x002A_0".to_owned(),
3173                "campaign_map_playable_areas/mapname".to_owned(),
3174                "campaign_map_playable_areas/maxx".to_owned(),
3175                "campaign_map_playable_areas/maxy".to_owned(),
3176                "campaign_map_playable_areas/minx".to_owned(),
3177                "campaign_map_playable_areas/miny".to_owned(),
3178                "campaign_map_settlements/template_name".to_owned(),
3179                "campaign_map_slots/template".to_owned(),
3180                "campaign_map_tooltips/Gen_TempField_x002A_0".to_owned(),
3181                "campaign_map_tooltips/Gen_TempField_x002A_1".to_owned(),
3182                "campaign_map_towns_and_ports/region".to_owned(),
3183                "campaign_map_towns_and_ports/template".to_owned(),
3184                "campaign_variables/Gen_description".to_owned(),
3185                "character_trait_levels/Gen_colour_text".to_owned(),
3186                "character_trait_levels/Gen_effect_text".to_owned(),
3187                "character_trait_levels/Gen_epithet_text".to_owned(),
3188                "character_trait_levels/Gen_explanation_text".to_owned(),
3189                "character_trait_levels/Gen_gain_text".to_owned(),
3190                "character_trait_levels/Gen_removal_text".to_owned(),
3191                "character_traits/Gen_comment".to_owned(),
3192                "character_traits/author".to_owned(),
3193                "commodities/price_elasticity_of_demand".to_owned(),
3194                "cursors/hotspotX".to_owned(),
3195                "cursors/hotspotY".to_owned(),
3196                "diplomacy_strings/Gen_TempField_x002A_1".to_owned(),
3197                "diplomatic_relations_religion/religion_A".to_owned(),
3198                "diplomatic_relations_religion/religion_B".to_owned(),
3199                "effect_bonus_value_projectile_junctions/bonus_value_id".to_owned(),
3200                "effects/Gen_description".to_owned(),
3201                "events/Gen_conditions".to_owned(),
3202                "events/Gen_event_text".to_owned(),
3203                "faction_groups/Afghanistan".to_owned(),
3204                "faction_groups/AfricanNatives".to_owned(),
3205                "faction_groups/AmerindIroquoisTribes".to_owned(),
3206                "faction_groups/AmerindTribesIII".to_owned(),
3207                "faction_groups/AmerindWoodlandTribes".to_owned(),
3208                "faction_groups/Austria".to_owned(),
3209                "faction_groups/BarbaryPirates".to_owned(),
3210                "faction_groups/Baroda".to_owned(),
3211                "faction_groups/Bavaria".to_owned(),
3212                "faction_groups/CrimeanKhanate".to_owned(),
3213                "faction_groups/Denmark".to_owned(),
3214                "faction_groups/EuropeanRebels".to_owned(),
3215                "faction_groups/France".to_owned(),
3216                "faction_groups/Genoa".to_owned(),
3217                "faction_groups/GreatBritain".to_owned(),
3218                "faction_groups/Greece".to_owned(),
3219                "faction_groups/Gwalior".to_owned(),
3220                "faction_groups/Haiti".to_owned(),
3221                "faction_groups/HanoverHesse".to_owned(),
3222                "faction_groups/Holland".to_owned(),
3223                "faction_groups/IndianRebels".to_owned(),
3224                "faction_groups/Indore".to_owned(),
3225                "faction_groups/IslamicRebels".to_owned(),
3226                "faction_groups/Malta".to_owned(),
3227                "faction_groups/Malwa".to_owned(),
3228                "faction_groups/Mamelukes".to_owned(),
3229                "faction_groups/MarathaConfederacy".to_owned(),
3230                "faction_groups/Modena".to_owned(),
3231                "faction_groups/Morocco".to_owned(),
3232                "faction_groups/MughalEmpire".to_owned(),
3233                "faction_groups/Mysore".to_owned(),
3234                "faction_groups/OttomanEmpire".to_owned(),
3235                "faction_groups/PapalStates".to_owned(),
3236                "faction_groups/Parma".to_owned(),
3237                "faction_groups/Pirates".to_owned(),
3238                "faction_groups/Poland".to_owned(),
3239                "faction_groups/Pomerania".to_owned(),
3240                "faction_groups/Portugal".to_owned(),
3241                "faction_groups/Prussia".to_owned(),
3242                "faction_groups/Punjab".to_owned(),
3243                "faction_groups/Russia".to_owned(),
3244                "faction_groups/SafavidEmpire".to_owned(),
3245                "faction_groups/Savoy".to_owned(),
3246                "faction_groups/Saxony".to_owned(),
3247                "faction_groups/Silesia".to_owned(),
3248                "faction_groups/SlaveRebels".to_owned(),
3249                "faction_groups/Spain".to_owned(),
3250                "faction_groups/Sweden".to_owned(),
3251                "faction_groups/Switzerland".to_owned(),
3252                "faction_groups/Tatars".to_owned(),
3253                "faction_groups/Tuscany".to_owned(),
3254                "faction_groups/USA".to_owned(),
3255                "faction_groups/Ujjain".to_owned(),
3256                "faction_groups/Venice".to_owned(),
3257                "faction_groups/Westphalia".to_owned(),
3258                "faction_groups/Wurttemberg".to_owned(),
3259                "factions/icons_path_units".to_owned(),
3260                "historical_characters/Gen_spawn_conditions".to_owned(),
3261                "ministerial_positions_by_gov_types/onscreen_name".to_owned(),
3262                "mission_activities/check_event".to_owned(),
3263                "mission_activities/evaluate_event".to_owned(),
3264                "mission_effects/Gen_text".to_owned(),
3265                "missions/Gen_TempField_x002A_0".to_owned(),
3266                "missions/Gen_cancel_condition".to_owned(),
3267                "missions/Gen_failure_condition".to_owned(),
3268                "missions/Gen_success_condition".to_owned(),
3269                "missions/cancellation_effect".to_owned(),
3270                "missions/failure_effect".to_owned(),
3271                "missions/success_effect".to_owned(),
3272                "mount_variants/key".to_owned(),
3273                "names_groups/Description".to_owned(),
3274                "names_groups/ID".to_owned(),
3275                "pdlc/ID".to_owned(),
3276                "pdlc/SteamID".to_owned(),
3277                "policies/Gen_prerequisites".to_owned(),
3278                "projectile_impacts/buildings".to_owned(),
3279                "projectile_shot_type_enum/is_artillery".to_owned(),
3280                "projectile_shot_type_enum/is_smallarms".to_owned(),
3281                "projectile_trails/min_apparent_width_distance".to_owned(),
3282                "projectiles/below_waterline_damage_modifer".to_owned(),
3283                "projectiles/bounce_angle".to_owned(),
3284                "projectiles/can_bounce".to_owned(),
3285                "projectiles/preflight_rules".to_owned(),
3286                "projectiles_explosions/non_lethal_detonation".to_owned(),
3287                "public_order_factors/Gen_TempField_x002A_0".to_owned(),
3288                "public_order_factors/Gen_TempField_x002A_1".to_owned(),
3289                "quotes/Gen_TempField_x002A_0".to_owned(),
3290                "quotes_people/Gen_TempField_x002A_0".to_owned(),
3291                "random_localisation_strings/Gen_string".to_owned(),
3292                "region_economics_factors/Gen_TempField_x002A_0".to_owned(),
3293                "regions/palette_entry".to_owned(),
3294                "sea_climate_details/sea_deep_colour".to_owned(),
3295                "sea_climate_details/sea_shallow_colour".to_owned(),
3296                "sea_climate_details/sky_colour".to_owned(),
3297                "sea_climate_details/sun_colour".to_owned(),
3298                "slots_art/minibuildings_differ_at_quality".to_owned(),
3299                "slots_art/underlay_differs_with_building".to_owned(),
3300                "slots_art/underlay_rotation".to_owned(),
3301                "slots_art/underlay_scale".to_owned(),
3302                "technologies/Gen_TempField_x002A_0".to_owned(),
3303                "technologies/Gen_TempField_x002A_1".to_owned(),
3304                "town_wealth_growth_factors/Gen_TempField_x002A_0".to_owned(),
3305                "town_wealth_growth_factors/Gen_TempField_x002A_1".to_owned(),
3306                "trade_details/Gen_TempField_x002A_0".to_owned(),
3307                "trade_nodes/ID".to_owned(),
3308                "trait_triggers/Gen_TempField_x002A_0".to_owned(),
3309                "trees/is_conifer".to_owned(),
3310                "trees/is_high_altitude".to_owned(),
3311                "trees/is_shrub".to_owned(),
3312                "trees/tree".to_owned(),
3313                "trigger_events/from_ui".to_owned(),
3314                "uniforms/Faction".to_owned(),
3315                "uniforms/Filename".to_owned(),
3316                "uniforms/IconScreenshotCameraPreset".to_owned(),
3317                "uniforms/InfoScreenshotCameraPreset".to_owned(),
3318                "uniforms/ManAnimation".to_owned(),
3319                "uniforms/MountAnimation".to_owned(),
3320                "uniforms/Uniform_Name".to_owned(),
3321                "uniforms/Unit".to_owned(),
3322                "unit_class/Gen_TempField_x002A_0".to_owned(),
3323                "unit_regiment_names/unit_class".to_owned(),
3324                "unit_stats_land/desert_effect".to_owned(),
3325                "unit_stats_land/dismounted_formation_spacing_horizontal".to_owned(),
3326                "unit_stats_land/dismounted_formation_spacing_vertical".to_owned(),
3327                "unit_stats_land/fatigue_resistant".to_owned(),
3328                "unit_stats_land/is_immune_to_attrition".to_owned(),
3329                "unit_stats_land/melee_defence".to_owned(),
3330                "unit_stats_land/snow_effect".to_owned(),
3331                "unit_stats_land/tropics_effect".to_owned(),
3332                "unit_stats_land/unit_class".to_owned(),
3333                "unit_stats_land_experience_bonuses/melee_defence".to_owned(),
3334                "unit_stats_naval/collision_momentum_modifer".to_owned(),
3335                "unit_stats_naval/reactivate_cost".to_owned(),
3336                "unit_stats_naval/repair_cost_port".to_owned(),
3337                "unit_stats_naval/repair_cost_sea".to_owned(),
3338                "unit_stats_naval/ship_rating_icon".to_owned(),
3339                "unit_stats_naval/side_panels_above_water_2_armour".to_owned(),
3340                "unit_stats_naval/side_panels_above_water_2_critical".to_owned(),
3341                "unit_stats_naval/side_panels_above_water_2_hits".to_owned(),
3342                "unit_stats_naval/stat_bar_manoeuvrability_rating".to_owned(),
3343                "unit_stats_naval_crew_to_factions/gunner_type".to_owned(),
3344                "unit_stats_naval_crew_to_factions/key".to_owned(),
3345                "unit_stats_naval_crew_to_factions/marine_type".to_owned(),
3346                "unit_stats_naval_crew_to_factions/officer_1".to_owned(),
3347                "unit_stats_naval_crew_to_factions/officer_2".to_owned(),
3348                "unit_stats_naval_crew_to_factions/officer_3".to_owned(),
3349                "unit_stats_naval_crew_to_factions/seaman_type".to_owned(),
3350                "units/era".to_owned(),
3351                "units/fitness".to_owned(),
3352                "unrest_cause_to_demands/demand".to_owned(),
3353                "warscape_rigid/category".to_owned(),
3354                "warscape_rigid_lod_range/LOD_id".to_owned(),
3355                "warscape_trees/model".to_owned(),
3356                "warscape_underlay_textures/filepath".to_owned(),
3357                "warscape_underlay_textures/height".to_owned(),
3358                "warscape_underlay_textures/orientation-angle".to_owned(),
3359                "warscape_underlay_textures/width".to_owned(),
3360                "wind_levels/magnitudeX".to_owned(),
3361                "wind_levels/magnitudeY".to_owned(),
3362            ],
3363            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
3364            compression_formats_supported: vec![],
3365            max_cs2_parsed_version: 0
3366        });
3367
3368        // Empire
3369        game_list.insert(KEY_EMPIRE, GameInfo {
3370            key: KEY_EMPIRE,
3371            display_name: DISPLAY_NAME_EMPIRE,
3372            pfh_versions: {
3373                let mut data = HashMap::new();
3374                data.insert(PFHFileType::Boot, PFHVersion::PFH0);
3375                data.insert(PFHFileType::Release, PFHVersion::PFH0);
3376                data.insert(PFHFileType::Patch, PFHVersion::PFH0);
3377                data.insert(PFHFileType::Mod, PFHVersion::PFH0);
3378                data.insert(PFHFileType::Movie, PFHVersion::PFH0);
3379                data
3380            },
3381            schema_file_name: "schema_emp.ron".to_owned(),
3382            dependencies_cache_file_name: "emp.pak2".to_owned(),
3383            raw_db_version: 0,
3384            portrait_settings_version: None,
3385            supports_editing: true,
3386            db_tables_have_guid: false,
3387            locale_file_name: Some("language.txt".to_owned()),
3388            banned_packedfiles: vec![],
3389            icon_small: "gs_emp.png".to_owned(),
3390            icon_big: "gs_big_emp.png".to_owned(),
3391            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
3392            install_data: {
3393                let mut data = HashMap::new();
3394                data.insert(InstallType::WinSteam, InstallData {
3395                    vanilla_packs: vec![
3396                        "anim.pack".to_owned(),
3397                        "battlepresets.pack".to_owned(),
3398                        "battleterrain.pack".to_owned(),
3399                        "boot.pack".to_owned(),
3400                        "groupformations.pack".to_owned(),
3401                        "local_en.pack".to_owned(),     // English
3402                        "local_br.pack".to_owned(),     // Brazilian
3403                        "local_cz.pack".to_owned(),     // Czech
3404                        "local_ge.pack".to_owned(),     // German
3405                        "local_sp.pack".to_owned(),     // Spanish
3406                        "local_fr.pack".to_owned(),     // French
3407                        "local_it.pack".to_owned(),     // Italian
3408                        "local_kr.pack".to_owned(),     // Korean
3409                        "local_pl.pack".to_owned(),     // Polish
3410                        "local_ru.pack".to_owned(),     // Russian
3411                        "local_tr.pack".to_owned(),     // Turkish
3412                        "local_cn.pack".to_owned(),     // Simplified Chinese
3413                        "local_zh.pack".to_owned(),     // Traditional Chinese
3414                        "main.pack".to_owned(),
3415                        "models.pack".to_owned(),
3416                        "movies.pack".to_owned(),
3417                        "patch.pack".to_owned(),
3418                        "patch_media.pack".to_owned(),
3419                        "patch_en.pack".to_owned(),     // English Patch
3420                        "patch_br.pack".to_owned(),     // Brazilian Patch
3421                        "patch_cz.pack".to_owned(),     // Czech Patch
3422                        "patch_ge.pack".to_owned(),     // German Patch
3423                        "patch_sp.pack".to_owned(),     // Spanish Patch
3424                        "patch_fr.pack".to_owned(),     // French Patch
3425                        "patch_it.pack".to_owned(),     // Italian Patch
3426                        "patch_kr.pack".to_owned(),     // Korean Patch
3427                        "patch_pl.pack".to_owned(),     // Polish Patch
3428                        "patch_ru.pack".to_owned(),     // Russian Patch
3429                        "patch_tr.pack".to_owned(),     // Turkish Patch
3430                        "patch_cn.pack".to_owned(),     // Simplified Chinese Patch
3431                        "patch_zh.pack".to_owned(),     // Traditional Chinese Patch
3432                        "patch2.pack".to_owned(),
3433                        "patch3.pack".to_owned(),
3434                        "patch4.pack".to_owned(),
3435                        "patch5.pack".to_owned(),
3436                        "seasurfaces.pack".to_owned(),
3437                        "sound_non_wavefile_data.pack".to_owned(),
3438                        "sounds.pack".to_owned(),
3439                        "sounds_animation_triggers.pack".to_owned(),
3440                        "sounds_campaign.pack".to_owned(),
3441                        "sounds_music.pack".to_owned(),
3442                        "sounds_other.pack".to_owned(),
3443                        "sounds_placeholder.pack".to_owned(),
3444                        "sounds_sfx.pack".to_owned(),
3445                        "subtitles.pack".to_owned(),
3446                        "supertexture.pack".to_owned(),
3447                        "terrain_templates.pack".to_owned(),
3448                        "testdata.pack".to_owned(),
3449                        "ui.pack".to_owned(),
3450                        "ui_movies.pack".to_owned(),
3451                        "voices.pack".to_owned(),
3452                    ],
3453                    use_manifest: false,
3454                    store_id: 10_500,
3455                    store_id_ak: 0,
3456                    executable: "Empire.exe".to_owned(),
3457                    data_path: "data".to_owned(),
3458                    language_path: "data".to_owned(),
3459                    local_mods_path: "data".to_owned(),
3460                    downloaded_mods_path: "./../../workshop/content/10500".to_owned(),
3461                    config_folder: Some("Empire".to_owned()),
3462                });
3463
3464                data.insert(InstallType::LnxSteam, InstallData {
3465                    vanilla_packs: vec![
3466                        "anim.pack".to_owned(),
3467                        "battlepresets.pack".to_owned(),
3468                        "battleterrain.pack".to_owned(),
3469                        "boot.pack".to_owned(),
3470                        "groupformations.pack".to_owned(),
3471                        "../languages/local_en.pack".to_owned(),     // English
3472                        "../languages/local_br.pack".to_owned(),     // Brazilian
3473                        "../languages/local_cz.pack".to_owned(),     // Czech
3474                        "../languages/local_ge.pack".to_owned(),     // German
3475                        "../languages/local_sp.pack".to_owned(),     // Spanish
3476                        "../languages/local_fr.pack".to_owned(),     // French
3477                        "../languages/local_it.pack".to_owned(),     // Italian
3478                        "../languages/local_kr.pack".to_owned(),     // Korean
3479                        "../languages/local_pl.pack".to_owned(),     // Polish
3480                        "../languages/local_ru.pack".to_owned(),     // Russian
3481                        "../languages/local_tr.pack".to_owned(),     // Turkish
3482                        "../languages/local_cn.pack".to_owned(),     // Simplified Chinese
3483                        "../languages/local_zh.pack".to_owned(),     // Traditional Chinese
3484                        "main.pack".to_owned(),
3485                        "models.pack".to_owned(),
3486                        "movies.pack".to_owned(),
3487                        "patch.pack".to_owned(),
3488                        "patch_media.pack".to_owned(),
3489                        "../languages/patch_en.pack".to_owned(),     // English Patch
3490                        "../languages/patch_br.pack".to_owned(),     // Brazilian Patch
3491                        "../languages/patch_cz.pack".to_owned(),     // Czech Patch
3492                        "../languages/patch_ge.pack".to_owned(),     // German Patch
3493                        "../languages/patch_sp.pack".to_owned(),     // Spanish Patch
3494                        "../languages/patch_fr.pack".to_owned(),     // French Patch
3495                        "../languages/patch_it.pack".to_owned(),     // Italian Patch
3496                        "../languages/patch_kr.pack".to_owned(),     // Korean Patch
3497                        "../languages/patch_pl.pack".to_owned(),     // Polish Patch
3498                        "../languages/patch_ru.pack".to_owned(),     // Russian Patch
3499                        "../languages/patch_tr.pack".to_owned(),     // Turkish Patch
3500                        "../languages/patch_cn.pack".to_owned(),     // Simplified Chinese Patch
3501                        "../languages/patch_zh.pack".to_owned(),     // Traditional Chinese Patch
3502                        "patch2.pack".to_owned(),
3503                        "patch3.pack".to_owned(),
3504                        "patch4.pack".to_owned(),
3505                        "patch5.pack".to_owned(),
3506                        "seasurfaces.pack".to_owned(),
3507                        "sound_non_wavefile_data.pack".to_owned(),
3508                        "sounds.pack".to_owned(),
3509                        "sounds_animation_triggers.pack".to_owned(),
3510                        "sounds_campaign.pack".to_owned(),
3511                        "sounds_music.pack".to_owned(),
3512                        "sounds_other.pack".to_owned(),
3513                        "sounds_placeholder.pack".to_owned(),
3514                        "sounds_sfx.pack".to_owned(),
3515                        "subtitles.pack".to_owned(),
3516                        "supertexture.pack".to_owned(),
3517                        "terrain_templates.pack".to_owned(),
3518                        "testdata.pack".to_owned(),
3519                        "ui.pack".to_owned(),
3520                        "ui_movies.pack".to_owned(),
3521                        "voices.pack".to_owned(),
3522                    ],
3523                    use_manifest: false,
3524                    store_id: 10_500,
3525                    store_id_ak: 0,
3526                    executable: "Empire.sh".to_owned(),
3527                    data_path: "data".to_owned(),
3528                    language_path: "data".to_owned(),
3529                    local_mods_path: "data".to_owned(),
3530                    downloaded_mods_path: "./../../workshop/content/10500".to_owned(),
3531                    config_folder: None,
3532                });
3533
3534                data
3535            },
3536            tool_vars: HashMap::new(),
3537            lua_autogen_folder: None,
3538            ak_lost_fields: vec![
3539                "_kv_fatigue/Gen_description".to_owned(),
3540                "_kv_morale/description".to_owned(),
3541                "_kv_naval_morale/description".to_owned(),
3542                "_kv_rules/Gen_description".to_owned(),
3543                "abilities/Gen_effect_text".to_owned(),
3544                "abilities/is_active".to_owned(),
3545                "abilities/project_specific".to_owned(),
3546                "advice_levels/Gen_TempField_x002A_1".to_owned(),
3547                "advice_levels/Gen_TempField_x002A_2".to_owned(),
3548                "advice_levels/Gen_onscreen_text".to_owned(),
3549                "agent_attribute_situations/Gen_effect_text".to_owned(),
3550                "agent_attribute_situations/project_specific".to_owned(),
3551                "agent_attributes/Gen_effect_text".to_owned(),
3552                "agent_attributes/project_specific".to_owned(),
3553                "agent_culture_details/project_specific".to_owned(),
3554                "agent_spawning_to_building_chains/project_specific".to_owned(),
3555                "agent_spawning_to_government_types/project_specific".to_owned(),
3556                "agent_spawnings/project_specific".to_owned(),
3557                "agent_to_agent_abilities/project_specific".to_owned(),
3558                "agent_to_agent_attributes/project_specific".to_owned(),
3559                "agent_to_bribe_actions/project_specific".to_owned(),
3560                "agents/associated_unit".to_owned(),
3561                "agents/project_specific".to_owned(),
3562                "ancillaries/Gen_colour_text".to_owned(),
3563                "ancillaries/Gen_effect_text".to_owned(),
3564                "ancillaries/Gen_exclusion_text".to_owned(),
3565                "ancillaries/Gen_explanation_text".to_owned(),
3566                "ancillary_info/Gen_comment".to_owned(),
3567                "ancillary_info/author".to_owned(),
3568                "ancillary_info/historical_example".to_owned(),
3569                "anim_reference_poses/Gen_path".to_owned(),
3570                "battle_bridge_subculture_jcts/project_specific".to_owned(),
3571                "battle_city_subculture_jct/project_specific".to_owned(),
3572                "battle_personalities/equipment_theme".to_owned(),
3573                "battle_script_strings/game_area".to_owned(),
3574                "battle_terrain_farms/project_specific".to_owned(),
3575                "battle_type_faction_presets/project_specific".to_owned(),
3576                "battle_weather_types/naval_appropriate".to_owned(),
3577                "battlefield_building_transformations/description".to_owned(),
3578                "battlefield_buildings/onscreen_name".to_owned(),
3579                "battlefield_deployable_siege_items/Gen_string".to_owned(),
3580                "battles/Gen_description".to_owned(),
3581                "battles/Gen_objectives_team_1".to_owned(),
3582                "battles/Gen_objectives_team_2".to_owned(),
3583                "bribe_actions/action".to_owned(),
3584                "bribe_actions/onscreen".to_owned(),
3585                "building_chains/Gen_chain_tooltip".to_owned(),
3586                "building_description_texts/Gen_TempField_x002A_0".to_owned(),
3587                "building_description_texts/Gen_long_description".to_owned(),
3588                "building_faction_variants/project_specific".to_owned(),
3589                "building_level_required_technology_junctions/project_specific".to_owned(),
3590                "building_levels/Gen_condition".to_owned(),
3591                "building_levels/building_category".to_owned(),
3592                "building_research_thread_junction/research_points_per_turn".to_owned(),
3593                "building_units_allowed/Gen_conditions".to_owned(),
3594                "building_units_allowed/XP".to_owned(),
3595                "campaign_ai_manager_behaviour_junctions/project_specific".to_owned(),
3596                "campaign_ai_managers/description".to_owned(),
3597                "campaign_ai_managers/project_specific".to_owned(),
3598                "campaign_ai_personalities/description".to_owned(),
3599                "campaign_ai_personalities/project_specific".to_owned(),
3600                "campaign_ai_personality_junctions/project_specific".to_owned(),
3601                "campaign_anim_action_to_sets/project_specific".to_owned(),
3602                "campaign_anim_sets/project_specific".to_owned(),
3603                "campaign_anim_transitions/Gen_path".to_owned(),
3604                "campaign_anim_transitions/ID".to_owned(),
3605                "campaign_anim_transitions/project_specific".to_owned(),
3606                "campaign_anims/Gen_path".to_owned(),
3607                "campaign_anims/project_specific".to_owned(),
3608                "campaign_character_anim_set_agent_junctions/project_specific".to_owned(),
3609                "campaign_character_anim_sets/project_specific".to_owned(),
3610                "campaign_character_anim_walk_anim_junctions/project_specific".to_owned(),
3611                "campaign_character_anims_junctions/project_specific".to_owned(),
3612                "campaign_map_playable_areas/Gen_TempField_x002A_0".to_owned(),
3613                "campaign_map_playable_areas/mapname".to_owned(),
3614                "campaign_map_playable_areas/maxx".to_owned(),
3615                "campaign_map_playable_areas/maxy".to_owned(),
3616                "campaign_map_playable_areas/minx".to_owned(),
3617                "campaign_map_playable_areas/miny".to_owned(),
3618                "campaign_map_playable_areas/project_specific".to_owned(),
3619                "campaign_map_settlements/project_specific".to_owned(),
3620                "campaign_map_settlements/template_name".to_owned(),
3621                "campaign_map_slots/project_specific".to_owned(),
3622                "campaign_map_slots/template".to_owned(),
3623                "campaign_map_tooltips/Gen_TempField_x002A_0".to_owned(),
3624                "campaign_map_tooltips/Gen_TempField_x002A_1".to_owned(),
3625                "campaign_map_tooltips/project_specific".to_owned(),
3626                "campaign_map_towns_and_ports/project_specific".to_owned(),
3627                "campaign_map_towns_and_ports/region".to_owned(),
3628                "campaign_variables/Gen_description".to_owned(),
3629                "character_trait_levels/Gen_colour_text".to_owned(),
3630                "character_trait_levels/Gen_effect_text".to_owned(),
3631                "character_trait_levels/Gen_epithet_text".to_owned(),
3632                "character_trait_levels/Gen_explanation_text".to_owned(),
3633                "character_trait_levels/Gen_gain_text".to_owned(),
3634                "character_trait_levels/Gen_removal_text".to_owned(),
3635                "character_traits/Gen_comment".to_owned(),
3636                "character_traits/author".to_owned(),
3637                "climates/project_specific".to_owned(),
3638                "commodities/price_elasticity_of_demand".to_owned(),
3639                "cultures/project_specific".to_owned(),
3640                "cultures_subcultures/project_specific".to_owned(),
3641                "cursors/hotspotX".to_owned(),
3642                "cursors/hotspotY".to_owned(),
3643                "diplomacy_factor_strings/project_specific".to_owned(),
3644                "diplomacy_negotiation_faction_override_strings/project_specific".to_owned(),
3645                "diplomacy_negotiation_strings/project_specific".to_owned(),
3646                "diplomacy_strings/Gen_TempField_x002A_1".to_owned(),
3647                "diplomatic_relations_religion/religion_A".to_owned(),
3648                "diplomatic_relations_religion/religion_B".to_owned(),
3649                "effect_bonus_value_basic_junction/project_specific".to_owned(),
3650                "effect_bonus_value_commodity_junction/project_specific".to_owned(),
3651                "effect_bonus_value_population_class_and_religion_junction/project_specific".to_owned(),
3652                "effect_bonus_value_population_class_junction/project_specific".to_owned(),
3653                "effect_bonus_value_projectile_junctions/bonus_value_id".to_owned(),
3654                "effect_bonus_value_projectile_junctions/project_specific".to_owned(),
3655                "effect_bonus_value_religion_junction/project_specific".to_owned(),
3656                "effect_bonus_value_resource_junction/project_specific".to_owned(),
3657                "effect_bonus_value_shot_type_junctions/project_specific".to_owned(),
3658                "effect_bonus_value_unit_ability_junctions/project_specific".to_owned(),
3659                "effect_bonus_value_unit_category_junction/project_specific".to_owned(),
3660                "effect_bonus_value_unit_class_junction/project_specific".to_owned(),
3661                "effects/Gen_description".to_owned(),
3662                "events/Gen_conditions".to_owned(),
3663                "events/Gen_event_text".to_owned(),
3664                "faction_groups/Afghanistan".to_owned(),
3665                "faction_groups/AfricanNatives".to_owned(),
3666                "faction_groups/AmerindIroquoisTribes".to_owned(),
3667                "faction_groups/AmerindTribesIII".to_owned(),
3668                "faction_groups/AmerindWoodlandTribes".to_owned(),
3669                "faction_groups/Austria".to_owned(),
3670                "faction_groups/BarbaryPirates".to_owned(),
3671                "faction_groups/Baroda".to_owned(),
3672                "faction_groups/Bavaria".to_owned(),
3673                "faction_groups/CrimeanKhanate".to_owned(),
3674                "faction_groups/Denmark".to_owned(),
3675                "faction_groups/EuropeanRebels".to_owned(),
3676                "faction_groups/France".to_owned(),
3677                "faction_groups/Genoa".to_owned(),
3678                "faction_groups/GreatBritain".to_owned(),
3679                "faction_groups/Greece".to_owned(),
3680                "faction_groups/Gwalior".to_owned(),
3681                "faction_groups/Haiti".to_owned(),
3682                "faction_groups/HanoverHesse".to_owned(),
3683                "faction_groups/Holland".to_owned(),
3684                "faction_groups/IndianRebels".to_owned(),
3685                "faction_groups/Indore".to_owned(),
3686                "faction_groups/IslamicRebels".to_owned(),
3687                "faction_groups/Malta".to_owned(),
3688                "faction_groups/Malwa".to_owned(),
3689                "faction_groups/Mamelukes".to_owned(),
3690                "faction_groups/MarathaConfederacy".to_owned(),
3691                "faction_groups/Modena".to_owned(),
3692                "faction_groups/Morocco".to_owned(),
3693                "faction_groups/MughalEmpire".to_owned(),
3694                "faction_groups/Mysore".to_owned(),
3695                "faction_groups/OttomanEmpire".to_owned(),
3696                "faction_groups/PapalStates".to_owned(),
3697                "faction_groups/Parma".to_owned(),
3698                "faction_groups/Pirates".to_owned(),
3699                "faction_groups/Poland".to_owned(),
3700                "faction_groups/Pomerania".to_owned(),
3701                "faction_groups/Portugal".to_owned(),
3702                "faction_groups/Prussia".to_owned(),
3703                "faction_groups/Punjab".to_owned(),
3704                "faction_groups/Russia".to_owned(),
3705                "faction_groups/SafavidEmpire".to_owned(),
3706                "faction_groups/Savoy".to_owned(),
3707                "faction_groups/Saxony".to_owned(),
3708                "faction_groups/Silesia".to_owned(),
3709                "faction_groups/SlaveRebels".to_owned(),
3710                "faction_groups/Spain".to_owned(),
3711                "faction_groups/Sweden".to_owned(),
3712                "faction_groups/Switzerland".to_owned(),
3713                "faction_groups/Tatars".to_owned(),
3714                "faction_groups/Tuscany".to_owned(),
3715                "faction_groups/USA".to_owned(),
3716                "faction_groups/Ujjain".to_owned(),
3717                "faction_groups/Venice".to_owned(),
3718                "faction_groups/Westphalia".to_owned(),
3719                "faction_groups/Wurttemberg".to_owned(),
3720                "factions/icons_path_units".to_owned(),
3721                "groupings_military/project_specific".to_owned(),
3722                "historical_characters/Gen_spawn_conditions".to_owned(),
3723                "loading_screens/project_specific".to_owned(),
3724                "ministerial_positions_by_gov_types/onscreen_name".to_owned(),
3725                "mission_activities/check_event".to_owned(),
3726                "mission_activities/evaluate_event".to_owned(),
3727                "mission_effects/Gen_text".to_owned(),
3728                "missions/Gen_TempField_x002A_0".to_owned(),
3729                "missions/Gen_cancel_condition".to_owned(),
3730                "missions/Gen_failure_condition".to_owned(),
3731                "missions/Gen_success_condition".to_owned(),
3732                "missions/cancellation_effect".to_owned(),
3733                "missions/failure_effect".to_owned(),
3734                "mount_variants/key".to_owned(),
3735                "mount_variants/project_specific".to_owned(),
3736                "mounts/project_specific".to_owned(),
3737                "names/project_specific".to_owned(),
3738                "names_groups/Description".to_owned(),
3739                "names_groups/ID".to_owned(),
3740                "pdlc/ID".to_owned(),
3741                "pdlc/SteamID".to_owned(),
3742                "pdlc/project_specific".to_owned(),
3743                "policies/Gen_prerequisites".to_owned(),
3744                "projectile_impacts/buildings".to_owned(),
3745                "projectile_shot_type_enum/is_artillery".to_owned(),
3746                "projectile_shot_type_enum/is_smallarms".to_owned(),
3747                "projectile_trails/min_apparent_width_distance".to_owned(),
3748                "projectiles/below_waterline_damage_modifer".to_owned(),
3749                "projectiles/bounce_angle".to_owned(),
3750                "projectiles/preflight_rules".to_owned(),
3751                "projectiles_explosions/non_lethal_detonation".to_owned(),
3752                "projectiles_explosions/project_specific".to_owned(),
3753                "public_order_factors/Gen_TempField_x002A_0".to_owned(),
3754                "public_order_factors/Gen_TempField_x002A_1".to_owned(),
3755                "quotes/Gen_TempField_x002A_0".to_owned(),
3756                "quotes/culture".to_owned(),
3757                "quotes/quote_person".to_owned(),
3758                "quotes_people/Gen_TempField_x002A_0".to_owned(),
3759                "random_localisation_strings/Gen_string".to_owned(),
3760                "random_localisation_strings/project_specific".to_owned(),
3761                "regions/palette_entry".to_owned(),
3762                "regions/project_specific".to_owned(),
3763                "sea_climate_details/sea_deep_colour".to_owned(),
3764                "sea_climate_details/sea_shallow_colour".to_owned(),
3765                "sea_climate_details/sky_colour".to_owned(),
3766                "sea_climate_details/sun_colour".to_owned(),
3767                "slots_art/minibuildings_differ_at_quality".to_owned(),
3768                "slots_art/project_specific".to_owned(),
3769                "slots_art/underlay_differs_with_building".to_owned(),
3770                "slots_art/underlay_rotation".to_owned(),
3771                "slots_art/underlay_scale".to_owned(),
3772                "technologies/Gen_TempField_x002A_0".to_owned(),
3773                "technologies/Gen_TempField_x002A_1".to_owned(),
3774                "technology_required_building_levels_junctions/project_specific".to_owned(),
3775                "technology_required_technology_junctions/project_specific".to_owned(),
3776                "town_wealth_growth_factors/Gen_TempField_x002A_0".to_owned(),
3777                "town_wealth_growth_factors/Gen_TempField_x002A_1".to_owned(),
3778                "trade_details/Gen_TempField_x002A_0".to_owned(),
3779                "trait_triggers/Gen_TempField_x002A_0".to_owned(),
3780                "trees/is_conifer".to_owned(),
3781                "trees/is_high_altitude".to_owned(),
3782                "trees/is_shrub".to_owned(),
3783                "trees/tree".to_owned(),
3784                "trigger_events/from_ui".to_owned(),
3785                "trigger_events/project_specific".to_owned(),
3786                "unit_regiment_names/unit_class".to_owned(),
3787                "unit_stats_land/desert_effect".to_owned(),
3788                "unit_stats_land/dismounted_formation_spacing_horizontal".to_owned(),
3789                "unit_stats_land/dismounted_formation_spacing_vertical".to_owned(),
3790                "unit_stats_land/fatigue_resistant".to_owned(),
3791                "unit_stats_land/melee_defence".to_owned(),
3792                "unit_stats_land/snow_effect".to_owned(),
3793                "unit_stats_land/tropics_effect".to_owned(),
3794                "unit_stats_land/unit_class".to_owned(),
3795                "unit_stats_land_experience_bonuses/melee_defence".to_owned(),
3796                "unit_stats_naval/collision_momentum_modifer".to_owned(),
3797                "unit_stats_naval/reactivate_cost".to_owned(),
3798                "unit_stats_naval/repair_cost_port".to_owned(),
3799                "unit_stats_naval/repair_cost_sea".to_owned(),
3800                "unit_stats_naval/ship_rating_icon".to_owned(),
3801                "unit_stats_naval/side_panels_above_water_2_armour".to_owned(),
3802                "unit_stats_naval/side_panels_above_water_2_critical".to_owned(),
3803                "unit_stats_naval/side_panels_above_water_2_hits".to_owned(),
3804                "unit_stats_naval/stat_bar_manoeuvrability_rating".to_owned(),
3805                "unit_stats_naval_crew_to_factions/gunner_type".to_owned(),
3806                "unit_stats_naval_crew_to_factions/key".to_owned(),
3807                "unit_stats_naval_crew_to_factions/marine_type".to_owned(),
3808                "unit_stats_naval_crew_to_factions/officer_1".to_owned(),
3809                "unit_stats_naval_crew_to_factions/officer_2".to_owned(),
3810                "unit_stats_naval_crew_to_factions/officer_3".to_owned(),
3811                "unit_stats_naval_crew_to_factions/seaman_type".to_owned(),
3812                "units/era".to_owned(),
3813                "units/fitness".to_owned(),
3814                "units_to_groupings_military_permissions/project_specific".to_owned(),
3815                "unrest_cause_to_demands/demand".to_owned(),
3816                "warscape_rigid/category".to_owned(),
3817                "warscape_rigid_lod_range/LOD_id".to_owned(),
3818                "warscape_trees/model".to_owned(),
3819                "warscape_underlay_textures/filepath".to_owned(),
3820                "warscape_underlay_textures/height".to_owned(),
3821                "warscape_underlay_textures/orientation-angle".to_owned(),
3822                "warscape_underlay_textures/width".to_owned(),
3823                "wind_levels/magnitudeX".to_owned(),
3824                "wind_levels/magnitudeY".to_owned(),
3825            ],
3826            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
3827            compression_formats_supported: vec![],
3828            max_cs2_parsed_version: 0
3829        });
3830
3831        // NOTE: There are things that depend on the order of this list, and this game must ALWAYS be the last one.
3832        // Otherwise, stuff that uses this list will probably break.
3833        // Arena
3834        game_list.insert(KEY_ARENA, GameInfo {
3835            key: KEY_ARENA,
3836            display_name: DISPLAY_NAME_ARENA,
3837            pfh_versions: {
3838                let mut data = HashMap::new();
3839                data.insert(PFHFileType::Boot, PFHVersion::PFH5);
3840                data.insert(PFHFileType::Release, PFHVersion::PFH5);
3841                data.insert(PFHFileType::Patch, PFHVersion::PFH5);
3842                data.insert(PFHFileType::Mod, PFHVersion::PFH5);
3843                data.insert(PFHFileType::Movie, PFHVersion::PFH5);
3844                data
3845            },
3846            schema_file_name: "schema_are.ron".to_owned(),
3847            dependencies_cache_file_name: "are.pack2".to_owned(),
3848            raw_db_version: -1,
3849            portrait_settings_version: None,
3850            supports_editing: false,
3851            db_tables_have_guid: true,
3852            locale_file_name: Some("language.txt".to_owned()),
3853            banned_packedfiles: vec![],
3854            icon_small: "gs_are.png".to_owned(),
3855            icon_big: "gs_big_are.png".to_owned(),
3856            vanilla_db_table_name_logic: VanillaDBTableNameLogic::FolderName,
3857            install_data: {
3858                let mut data = HashMap::new();
3859                data.insert(InstallType::WinWargaming, InstallData {
3860                    vanilla_packs: vec![],
3861                    use_manifest: false,
3862                    store_id: 0,
3863                    store_id_ak: 0,
3864                    executable: "Arena.exe".to_owned(),
3865                    data_path: "data".to_owned(),
3866                    language_path: "data".to_owned(),
3867                    local_mods_path: "data".to_owned(),
3868                    downloaded_mods_path: "".to_owned(),
3869                    config_folder: None,
3870                });
3871
3872                data
3873            },
3874            tool_vars: HashMap::new(),
3875            lua_autogen_folder: None,
3876            ak_lost_fields: vec![],
3877            install_type_cache: Arc::new(RwLock::new(HashMap::new())),
3878            compression_formats_supported: vec![],
3879            max_cs2_parsed_version: 0
3880        });
3881
3882        let order_list = vec![
3883            KEY_SHOGUN_2_COMPLETE_EDITION,
3884            KEY_PHARAOH_DYNASTIES,
3885            KEY_PHARAOH,
3886            KEY_WARHAMMER_3,
3887            KEY_TROY,
3888            KEY_THREE_KINGDOMS,
3889            KEY_WARHAMMER_2,
3890            KEY_WARHAMMER,
3891            KEY_THRONES_OF_BRITANNIA,
3892            KEY_ATTILA,
3893            KEY_ROME_2,
3894            KEY_SHOGUN_2,
3895            KEY_NAPOLEON,
3896            KEY_EMPIRE,
3897            KEY_ARENA,
3898        ];
3899
3900        Self {
3901            games: game_list,
3902            order: order_list,
3903        }
3904    }
3905}
3906
3907/// Implementation for `SupportedGames`.
3908impl SupportedGames {
3909
3910    /// Retrieves game information by key.
3911    ///
3912    /// # Arguments
3913    ///
3914    /// * `key` - Game key constant (e.g., [`KEY_WARHAMMER_3`])
3915    ///
3916    /// # Returns
3917    ///
3918    /// Returns `Some(&GameInfo)` if the game is supported, `None` otherwise.
3919    ///
3920    /// # Example
3921    ///
3922    /// ```ignore
3923    /// use rpfm_lib::games::supported_games::{SupportedGames, KEY_WARHAMMER_3};
3924    ///
3925    /// let games = SupportedGames::default();
3926    /// let game = games.game(&KEY_WARHAMMER_3).unwrap();
3927    /// assert_eq!(game.key(), KEY_WARHAMMER_3);
3928    /// ```
3929    pub fn game(&self, key: &str) -> Option<&GameInfo> {
3930        self.games.get(key)
3931    }
3932
3933    /// Returns all supported games in arbitrary order.
3934    ///
3935    /// For games sorted by release date, use [`SupportedGames::games_sorted()`].
3936    ///
3937    /// # Returns
3938    ///
3939    /// Vector of references to all game configurations.
3940    pub fn games(&self) -> Vec<&GameInfo> {
3941        self.games.values().collect::<Vec<&GameInfo>>()
3942    }
3943
3944    /// Returns all game keys in arbitrary order.
3945    ///
3946    /// For keys sorted by release date, use [`SupportedGames::game_keys_sorted()`].
3947    ///
3948    /// # Returns
3949    ///
3950    /// Vector of game key strings.
3951    pub fn game_keys(&self) -> Vec<&str> {
3952        self.games.keys().cloned().collect::<Vec<&str>>()
3953    }
3954
3955    /// Returns all supported games sorted by release date (newest first).
3956    ///
3957    /// Use this when displaying games in UI to show them in chronological order.
3958    ///
3959    /// # Returns
3960    ///
3961    /// Vector of game references in release order.
3962    pub fn games_sorted(&self) -> Vec<&GameInfo> {
3963        self.order.iter().map(|key| self.game(key).unwrap()).collect::<Vec<&GameInfo>>()
3964    }
3965
3966    /// Returns all game keys sorted by release date (newest first).
3967    ///
3968    /// # Returns
3969    ///
3970    /// Slice of game keys in release order.
3971    pub fn game_keys_sorted(&self) -> &[&'static str] {
3972        &self.order
3973    }
3974}