tiger_lib/vic3/data/
discrimination_traits.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::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 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}