tiger_lib/data/
dlc.rs

1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::{Game, GameFlags};
5use crate::item::{Item, ItemLoader};
6use crate::token::Token;
7use crate::validator::Validator;
8
9#[derive(Clone, Debug)]
10pub struct Dlc {}
11
12inventory::submit! {
13    ItemLoader::Normal(GameFlags::Ck3.union(GameFlags::Vic3).union(GameFlags::Hoi4), Item::Dlc, Dlc::add)
14}
15
16impl Dlc {
17    pub fn add(db: &mut Db, key: Token, block: Block) {
18        db.add(Item::Dlc, key, block, Box::new(Self {}));
19    }
20}
21
22impl DbKind for Dlc {
23    fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
24        let field = match Game::game() {
25            #[cfg(feature = "ck3")]
26            Game::Ck3 => "key",
27            #[cfg(feature = "vic3")]
28            Game::Vic3 => "name",
29            #[cfg(feature = "imperator")]
30            Game::Imperator => "key",
31            #[cfg(feature = "eu5")]
32            Game::Eu5 => "name", // TODO: EU5 verify
33            #[cfg(feature = "hoi4")]
34            Game::Hoi4 => "name",
35        };
36        if let Some(name) = block.get_field_value(field) {
37            db.add_flag(Item::DlcName, name.clone());
38        }
39    }
40
41    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
42        let mut vd = Validator::new(block, data);
43
44        if Game::is_jomini() {
45            data.verify_exists(Item::Localization, key);
46            let loca = format!("{key}_desc");
47            data.verify_exists_implied(Item::Localization, &loca, key);
48        }
49
50        if Game::is_vic3() && block.get_field_bool("theme_provider").unwrap_or(false) {
51            let path = format!("gfx/interface/icons/dlc_icons/{key}.dds");
52            data.verify_exists_implied(Item::File, &path, key);
53            let path = format!("gfx/interface/banners/dlc_banners/{key}.dds");
54            data.verify_exists_implied(Item::File, &path, key);
55        } else if Game::is_ck3() {
56            let path = format!("gfx/interface/illustrations/dlc_event_decorations/{key}.dds");
57            data.verify_exists_implied(Item::File, &path, key);
58            let path = format!("gfx/interface/icons/dlc/{key}.dds");
59            data.verify_exists_implied(Item::File, &path, key);
60        }
61
62        if Game::is_vic3() {
63            vd.req_field("name");
64            vd.field_value("name");
65            vd.field_choice("type", &["minor", "major"]);
66            vd.field_integer("priority");
67        } else if Game::is_ck3() {
68            vd.req_field("key");
69            vd.field_value("key");
70            vd.field_choice("type", &["minor", "medium", "major"]);
71            vd.field_integer("priority");
72        } else if Game::is_hoi4() {
73            vd.req_field("name");
74            vd.field_value("name");
75            vd.field_bool("major");
76        }
77
78        vd.field_value("steam_id");
79        vd.field_value("msgr_id");
80
81        if Game::is_vic3() {
82            vd.field_bool("theme_provider");
83        } else if Game::is_ck3() {
84            // Documented but not used
85            vd.field_list_items("features", Item::Localization);
86        } else if Game::is_hoi4() {
87            #[cfg(feature = "hoi4")]
88            vd.field_item("career_profile_background_promotion", Item::Sprite);
89            #[cfg(feature = "hoi4")]
90            vd.field_item("career_profile_background_owned", Item::Sprite);
91            vd.field_item("localization_key", Item::Localization);
92            vd.field_item("description", Item::Localization);
93            vd.field_value("web_link");
94        }
95    }
96}