tiger_lib/data/
ethnicity.rs1use 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 data.validate_use(Item::GeneCategory, key, block);
67 }
68 }
69 });
70 }
71}