tiger_lib/data/
ethnicity.rs

1use crate::block::Block;
2use crate::data::genes::Gene;
3use crate::db::{Db, DbKind};
4use crate::everything::Everything;
5use crate::game::{Game, GameFlags};
6use crate::item::{Item, ItemLoader};
7use crate::report::{Confidence, Severity};
8use crate::token::Token;
9use crate::validate::validate_numeric_range;
10use crate::validator::Validator;
11
12#[derive(Clone, Debug)]
13pub struct Ethnicity {}
14
15inventory::submit! {
16    ItemLoader::Normal(GameFlags::jomini(), Item::Ethnicity, Ethnicity::add)
17}
18
19impl Ethnicity {
20    pub fn add(db: &mut Db, key: Token, block: Block) {
21        db.add(Item::Ethnicity, key, block, Box::new(Self {}));
22    }
23}
24
25impl DbKind for Ethnicity {
26    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
27        let mut vd = Validator::new(block, data);
28        vd.set_max_severity(Severity::Warning);
29        vd.field_bool("visible");
30        if !block.field_value_is("visible", "no") {
31            if Game::is_ck3() {
32                data.verify_exists(Item::Localization, key);
33            } else if Game::is_vic3() {
34                let loca = format!("ethnicity_{key}");
35                data.verify_exists_implied(Item::Localization, &loca, key);
36            }
37        }
38        vd.field_item("template", Item::Ethnicity);
39        vd.field_item("using", Item::Culture);
40        vd.unknown_block_fields(|key, block| {
41            data.verify_exists(Item::GeneCategory, key);
42            let mut vd = Validator::new(block, data);
43            vd.set_max_severity(Severity::Warning);
44            for (_, block) in vd.integer_blocks() {
45                if let Some(token) = block.get_field_value("name") {
46                    let mut vd = Validator::new(block, data);
47                    vd.set_max_severity(Severity::Warning);
48                    vd.field_value("name");
49                    Gene::verify_has_template(key.as_str(), token, data);
50                    vd.field_validated_block("range", |block, data| {
51                        validate_numeric_range(
52                            block,
53                            data,
54                            0.0,
55                            1.0,
56                            Severity::Warning,
57                            Confidence::Reasonable,
58                        );
59                    });
60                    #[cfg(feature = "ck3")]
61                    if Game::is_ck3() {
62                        vd.field_list_items("traits", Item::GeneticConstraint);
63                    }
64                } else {
65                    // for color genes
66                    data.validate_use(Item::GeneCategory, key, block);
67                }
68            }
69        });
70    }
71}