tiger_lib/imperator/data/
culture.rs1use 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"); 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}