tiger_lib/vic3/data/
discrimination_traits.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::validator::Validator;
8
9#[derive(Clone, Debug)]
10pub struct DiscriminationTrait {}
11#[derive(Clone, Debug)]
12pub struct DiscriminationTraitGroup {}
13
14inventory::submit! {
15    ItemLoader::Normal(GameFlags::Vic3, Item::DiscriminationTrait, DiscriminationTrait::add)
16}
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Vic3, Item::DiscriminationTraitGroup, DiscriminationTraitGroup::add)
19}
20
21impl DiscriminationTrait {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::DiscriminationTrait, key, block, Box::new(Self {}));
24    }
25}
26impl DiscriminationTraitGroup {
27    pub fn add(db: &mut Db, key: Token, block: Block) {
28        db.add(Item::DiscriminationTraitGroup, key, block, Box::new(Self {}));
29    }
30}
31
32impl DbKind for DiscriminationTrait {
33    fn add_subitems(&self, key: &Token, block: &Block, db: &mut Db) {
34        if let Some(token) = block.get_field_value("type") {
35            if token.is("tradition") {
36                db.add_flag(Item::TraditionTrait, key.clone());
37            } else if token.is("language") {
38                db.add_flag(Item::LanguageTrait, key.clone());
39            } else if token.is("heritage") {
40                db.add_flag(Item::HeritageTrait, key.clone());
41            }
42        }
43    }
44
45    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
46        let mut vd = Validator::new(block, data);
47
48        data.verify_exists(Item::Localization, key);
49
50        vd.field_choice("type", &["heritage", "language", "tradition"]);
51        if block.get_field_value("type").is_some_and(|token| token.is("tradition")) {
52            vd.ban_field("trait_group", || "language and tradition types");
53        } else {
54            // TODO: check that heritage traits have heritage trait groups and language traits have
55            // language trait groups
56            vd.field_item("trait_group", Item::DiscriminationTraitGroup);
57        }
58    }
59}
60
61impl DbKind for DiscriminationTraitGroup {
62    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
63        let mut vd = Validator::new(block, data);
64
65        data.verify_exists(Item::Localization, key);
66
67        vd.field_choice("type", &["heritage", "language"]);
68    }
69}