tiger_lib/ck3/data/
flavorization.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use crate::block::Block;
use crate::db::{Db, DbKind};
use crate::everything::Everything;
use crate::game::GameFlags;
use crate::item::{Item, ItemLoader};
use crate::token::Token;
use crate::validator::Validator;

#[derive(Clone, Debug)]
pub struct Flavorization {}

inventory::submit! {
    ItemLoader::Normal(GameFlags::Ck3, Item::Flavorization, Flavorization::add)
}

impl Flavorization {
    pub fn add(db: &mut Db, key: Token, block: Block) {
        db.add(Item::Flavorization, key, block, Box::new(Self {}));
    }
}

impl DbKind for Flavorization {
    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
        let mut vd = Validator::new(block, data);

        data.verify_exists(Item::Localization, key);

        vd.req_field("type");
        vd.field_choice("type", &["character", "title", "domicile"]);
        let flavor_type = block.get_field_value("type").map_or("none", Token::as_str);
        if flavor_type == "character" {
            vd.field_choice("gender", &["male", "female"]);
            vd.field_choice(
                "special",
                &[
                    "ruler_child",
                    "holder",
                    "queen_mother",
                    "head_of_faith",
                    "councillor",
                    "domicile",
                ],
            );
        } else {
            vd.ban_field("gender", || "type = character");
            vd.ban_field("special", || "type = character");
        }
        if flavor_type == "character" || flavor_type == "title" {
            vd.field_choice("tier", &["empire", "kingdom", "duchy", "county", "barony", "none"]);
        } else {
            vd.ban_field("tier", || "type = character or title");
        }
        vd.field_integer("priority");
        vd.advice_field("flavorization_rules", "Should be `flavourization_rules`");
        vd.field_validated_block("flavourization_rules", |block, data| {
            let mut vd = Validator::new(block, data);
            vd.field_bool("faction");
            vd.field_bool("only_independent");
            vd.field_bool("spouse_takes_title");
            vd.field_bool("only_holder");
            vd.field_bool("top_liege");
            vd.field_bool("only_vassals");
            vd.field_bool("ignore_top_liege_government");
        });
        vd.field_value("flag");
        vd.field_list_items("governments", Item::GovernmentType);
        vd.field_item("domicile_type", Item::DomicileType);
        vd.field_list_items("name_lists", Item::NameList);
        vd.field_list_items("heritages", Item::CultureHeritage);
        vd.field_list_items("faiths", Item::Faith);
        vd.field_list_items("religions", Item::Religion);
        vd.field_item("council_position", Item::CouncilPosition);
        vd.field_list_items("de_jure_liege", Item::Title);
        vd.field_item("holding", Item::HoldingType);
        vd.field_list_items("titles", Item::Title);

        vd.advice_field("top_liege", "moved into flavorization_rules");
        vd.advice_field("only_holder", "moved into flavorization_rules");
        vd.advice_field("only_independent", "moved into flavorization_rules");
        vd.advice_field("faction", "moved into flavorization_rules");
    }
}