tiger_lib/ck3/data/
flavorization.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 Flavorization {}
11
12inventory::submit! {
13    ItemLoader::Normal(GameFlags::Ck3, Item::Flavorization, Flavorization::add)
14}
15
16impl Flavorization {
17    pub fn add(db: &mut Db, key: Token, block: Block) {
18        db.add(Item::Flavorization, key, block, Box::new(Self {}));
19    }
20}
21
22impl DbKind for Flavorization {
23    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
24        let mut vd = Validator::new(block, data);
25
26        data.verify_exists(Item::Localization, key);
27
28        vd.req_field("type");
29        vd.field_choice("type", &["character", "title", "domicile"]);
30        let flavor_type = block.get_field_value("type").map_or("none", Token::as_str);
31        if flavor_type == "character" {
32            vd.field_choice("gender", &["male", "female"]);
33            vd.field_choice(
34                "special",
35                &[
36                    "ruler_child",
37                    "holder",
38                    "queen_mother",
39                    "head_of_faith",
40                    "councillor",
41                    "domicile",
42                ],
43            );
44        } else {
45            vd.ban_field("gender", || "type = character");
46            vd.ban_field("special", || "type = character");
47        }
48        if flavor_type == "character" || flavor_type == "title" {
49            vd.field_choice(
50                "tier",
51                &["hegemony", "empire", "kingdom", "duchy", "county", "barony", "none"],
52            );
53        } else {
54            vd.ban_field("tier", || "type = character or title");
55        }
56        vd.field_integer("priority");
57        vd.advice_field("flavorization_rules", "Should be `flavourization_rules`");
58        vd.field_validated_block("flavourization_rules", |block, data| {
59            let mut vd = Validator::new(block, data);
60            vd.field_bool("faction");
61            vd.field_bool("only_independent");
62            vd.field_bool("spouse_takes_title");
63            vd.field_bool("only_holder");
64            vd.field_bool("top_liege");
65            vd.field_bool("only_vassals");
66            vd.field_bool("ignore_top_liege_government");
67        });
68        vd.field_value("flag");
69        vd.field_list_items("governments", Item::GovernmentType);
70        vd.field_item("domicile_type", Item::DomicileType);
71        vd.field_list_items("name_lists", Item::NameList);
72        vd.field_list_items("heritages", Item::CultureHeritage);
73        vd.field_list_items("faiths", Item::Faith);
74        vd.field_list_items("religions", Item::Religion);
75        vd.field_item("council_position", Item::CouncilPosition);
76        vd.field_list_items("de_jure_liege", Item::Title);
77        vd.field_item("holding", Item::HoldingType);
78        vd.field_list_items("titles", Item::Title);
79        // TODO: this allows vassal contract flags but what else?
80        vd.field_list("subject_contract_obligation_flags");
81
82        vd.advice_field("top_liege", "moved into flavorization_rules");
83        vd.advice_field("only_holder", "moved into flavorization_rules");
84        vd.advice_field("only_independent", "moved into flavorization_rules");
85        vd.advice_field("faction", "moved into flavorization_rules");
86    }
87}