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", #[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 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}