tiger_lib/imperator/data/
culture.rs

1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader};
6use crate::token::Token;
7use crate::validate::validate_color;
8use crate::validator::Validator;
9
10#[derive(Clone, Debug)]
11pub struct CultureGroup {}
12
13inventory::submit! {
14    ItemLoader::Normal(GameFlags::Imperator, Item::CultureGroup, CultureGroup::add)
15}
16
17impl CultureGroup {
18    pub fn add(db: &mut Db, key: Token, block: Block) {
19        db.add(Item::CultureGroup, key, block, Box::new(Self {}));
20    }
21}
22
23impl DbKind for CultureGroup {
24    fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
25        if let Some(block) = block.get_field_block("culture") {
26            for (culture, block) in block.iter_definitions() {
27                db.add(Item::Culture, culture.clone(), block.clone(), Box::new(Culture {}));
28            }
29        }
30    }
31
32    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
33        let mut vd = Validator::new(block, data);
34
35        data.verify_exists(Item::Localization, key);
36        let loca1 = format!("{key}_malename");
37        let loca2 = format!("{key}_femalename");
38        let loca3 = format!("ARMY_NAME_{key}");
39        let loca4 = format!("NAVY_NAME_{key}");
40        let loca5 = format!("COHORT_NAME_{key}");
41        data.verify_exists_implied(Item::Localization, &loca1, key);
42        data.verify_exists_implied(Item::Localization, &loca2, key);
43        data.verify_exists_implied(Item::Localization, &loca3, key);
44        data.verify_exists_implied(Item::Localization, &loca4, key);
45        data.verify_exists_implied(Item::Localization, &loca5, key);
46
47        vd.field_validated_block("color", validate_color);
48        vd.field_item("primary", Item::Unit);
49        vd.field_item("second", Item::Unit);
50        vd.field_item("flank", Item::Unit);
51        vd.field_item("primary_navy", Item::Unit);
52        vd.field_item("secondary_navy", Item::Unit);
53        vd.field_item("flank_navy", Item::Unit);
54        vd.field_item("levy_template", Item::LevyTemplate);
55        vd.field_item("graphical_culture", Item::GraphicalCultureType);
56        vd.field_bool("use_latin_name_rules");
57
58        vd.field_validated_block("nickname", validate_name_list);
59        vd.field_validated_block("female_order", validate_name_list);
60        vd.field_validated_block("male_names", validate_name_list);
61        vd.field_validated_block("female_names", validate_name_list);
62        vd.field_validated_block("barbarian_names", validate_name_list);
63        vd.field_validated_block("family", validate_family_name_list);
64
65        vd.field_block("culture"); // validated by Culture class
66
67        vd.field_validated_block("ethnicities", |block, data| {
68            let mut vd = Validator::new(block, data);
69            vd.unknown_value_fields(|_key, value| {
70                data.verify_exists(Item::Ethnicity, value);
71            });
72        });
73    }
74}
75
76fn validate_name_list(block: &Block, data: &Everything) {
77    let mut vd = Validator::new(block, data);
78    for token in vd.values() {
79        data.verify_exists(Item::Localization, token);
80    }
81    for (_, block) in vd.integer_blocks() {
82        let mut vd = Validator::new(block, data);
83        for token in vd.values() {
84            data.verify_exists(Item::Localization, token);
85        }
86    }
87}
88
89fn validate_family_name_list(block: &Block, data: &Everything) {
90    let mut vd = Validator::new(block, data);
91    for token in vd.values() {
92        for key in token.split('.') {
93            data.verify_exists(Item::Localization, &key);
94        }
95    }
96}
97
98#[derive(Clone, Debug)]
99pub struct Culture {}
100
101impl DbKind for Culture {
102    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
103        let mut vd = Validator::new(block, data);
104        data.verify_exists(Item::Localization, key);
105
106        vd.field_item("levy_template", Item::LevyTemplate);
107        vd.field_validated_block("nickname", validate_name_list);
108        vd.field_validated_block("male_names", validate_name_list);
109        vd.field_validated_block("female_names", validate_name_list);
110        vd.field_validated_block("family", validate_family_name_list);
111    }
112}