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