tiger_lib/ck3/data/
modif.rs

1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::ck3::tables::modifs::modif_loc;
4use crate::db::{Db, DbKind};
5use crate::everything::Everything;
6use crate::game::GameFlags;
7use crate::item::{Item, ItemLoader};
8use crate::modif::verify_modif_exists;
9use crate::report::Severity;
10use crate::token::Token;
11use crate::validator::Validator;
12
13#[derive(Clone, Debug)]
14pub struct ModifierFormat {}
15
16inventory::submit! {
17    ItemLoader::Normal(GameFlags::Ck3, Item::ModifierFormat, ModifierFormat::add)
18}
19
20impl ModifierFormat {
21    pub fn add(db: &mut Db, key: Token, block: Block) {
22        db.add(Item::ModifierFormat, key, block, Box::new(Self {}));
23    }
24}
25
26impl DbKind for ModifierFormat {
27    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
28        let mut vd = Validator::new(block, data);
29
30        if let Some("yes") = vd.field_value("hidden").map(Token::as_str) {
31            // hidden hence no localization check needed, e.g. `ai_<value>`
32        } else {
33            let loca = modif_loc(key);
34            data.verify_exists_implied(Item::Localization, &loca, key);
35        }
36
37        verify_modif_exists(key, data, ModifKinds::all(), Severity::Untidy);
38
39        vd.field_integer("decimals");
40        vd.field_choice("color", &["good", "neutral", "bad"]);
41
42        vd.field_item("prefix", Item::Localization);
43        vd.field_item("suffix", Item::Localization);
44        vd.field_item("negative_suffix", Item::Localization);
45
46        vd.field_item("dlc_feature", Item::DlcFeature);
47
48        // Docs say these are in a `format = { ... }` block, but apparently not.
49        vd.field_bool("percent");
50        vd.field_bool("already_percent");
51        vd.field_bool("hidden");
52        vd.field_bool("no_difference_sign");
53    }
54}