tiger_lib/vic3/data/
cultures.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_possibly_named_color;
8use crate::validator::Validator;
9use crate::vic3::tables::modifs::maybe_warn_modifiable_capitalization;
10
11#[derive(Clone, Debug)]
12pub struct Culture {}
13
14inventory::submit! {
15    ItemLoader::Normal(GameFlags::Vic3, Item::Culture, Culture::add)
16}
17
18impl Culture {
19    pub fn add(db: &mut Db, key: Token, block: Block) {
20        db.add(Item::Culture, key, block, Box::new(Self {}));
21    }
22}
23
24impl DbKind for Culture {
25    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
26        maybe_warn_modifiable_capitalization(key);
27
28        let mut vd = Validator::new(block, data);
29
30        data.verify_exists(Item::Localization, key);
31
32        // The game will log errors if these are not defined.
33        let modif = format!("{key}_standard_of_living_modifier_positive");
34        data.verify_exists_implied(Item::Modifier, &modif, key);
35        let modif = format!("{key}_standard_of_living_modifier_negative");
36        data.verify_exists_implied(Item::Modifier, &modif, key);
37        let modif = format!("{key}_cultural_acceptance_modifier_positive");
38        data.verify_exists_implied(Item::Modifier, &modif, key);
39        let modif = format!("{key}_cultural_acceptance_modifier_negative");
40        data.verify_exists_implied(Item::Modifier, &modif, key);
41        let modif = format!("{key}_fervor_target_modifier_positive");
42        data.verify_exists_implied(Item::Modifier, &modif, key);
43        let modif = format!("{key}_fervor_target_modifier_negative");
44        data.verify_exists_implied(Item::Modifier, &modif, key);
45
46        vd.field_validated("color", validate_possibly_named_color);
47        vd.field_item("religion", Item::Religion);
48        vd.advice_field("traits", "replaced with language, heritage, and traditions");
49        vd.field_item("language", Item::LanguageTrait);
50        vd.field_item("heritage", Item::HeritageTrait);
51        vd.multi_field_list_items("traditions", Item::TraditionTrait);
52
53        vd.multi_field_list_items("male_common_first_names", Item::Localization);
54        vd.multi_field_list_items("female_common_first_names", Item::Localization);
55        vd.multi_field_list_items("male_noble_first_names", Item::Localization);
56        vd.multi_field_list_items("female_noble_first_names", Item::Localization);
57        vd.multi_field_list_items("male_regal_first_names", Item::Localization);
58        vd.multi_field_list_items("female_regal_first_names", Item::Localization);
59        vd.multi_field_list_items("common_last_names", Item::Localization);
60        vd.multi_field_list_items("noble_last_names", Item::Localization);
61        vd.multi_field_list_items("regal_last_names", Item::Localization);
62
63        vd.multi_field_list_items("obsessions", Item::Goods);
64        vd.multi_field_list_items("taboos", Item::Goods);
65
66        vd.field_item("graphics", Item::CultureGraphics);
67        vd.multi_field_validated_block("ethnicities", |block, data| {
68            let mut vd = Validator::new(block, data);
69            vd.numeric_keys(|_, bv| {
70                if let Some(token) = bv.expect_value() {
71                    data.verify_exists(Item::Ethnicity, token);
72                }
73            });
74        });
75
76        // undocumented fields
77
78        vd.field_value("name_format"); // valid values not known
79    }
80}
81
82#[derive(Clone, Debug)]
83pub struct CultureGraphics {}
84
85inventory::submit! {
86    ItemLoader::Normal(GameFlags::Vic3, Item::CultureGraphics, CultureGraphics::add)
87}
88
89impl CultureGraphics {
90    pub fn add(db: &mut Db, key: Token, block: Block) {
91        db.add(Item::CultureGraphics, key, block, Box::new(Self {}));
92    }
93}
94
95impl DbKind for CultureGraphics {
96    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
97        // When it is dropped, this validator will check that the block is empty
98        Validator::new(block, data);
99    }
100}