tiger_lib/ck3/data/
diarchies.rs

1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::context::ScopeContext;
4use crate::db::{Db, DbKind};
5use crate::everything::Everything;
6use crate::game::GameFlags;
7use crate::item::{Item, ItemLoader};
8use crate::modif::validate_modifs;
9use crate::scopes::Scopes;
10use crate::token::Token;
11use crate::tooltipped::Tooltipped;
12use crate::validator::Validator;
13
14#[derive(Clone, Debug)]
15pub struct DiarchyType {}
16
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Ck3, Item::DiarchyType, DiarchyType::add)
19}
20
21impl DiarchyType {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::DiarchyType, key, block, Box::new(Self {}));
24    }
25}
26
27impl DbKind for DiarchyType {
28    fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
29        for block in block.get_field_blocks("power_level") {
30            for token in block.get_field_values("parameter") {
31                db.add_flag(Item::DiarchyParameter, token.clone());
32            }
33            for token in block.get_field_values("hidden_parameter") {
34                db.add_flag(Item::DiarchyParameter, token.clone());
35            }
36        }
37    }
38
39    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
40        let mut vd = Validator::new(block, data);
41        let mut sc = ScopeContext::new(Scopes::Character, key);
42
43        let loca = format!("{key}_diarchy_type");
44        data.verify_exists_implied(Item::Localization, &loca, key);
45        let loca = format!("{key}_diarch_title");
46        data.verify_exists_implied(Item::Localization, &loca, key);
47
48        vd.field_trigger("start", Tooltipped::No, &mut sc);
49        vd.field_trigger("end", Tooltipped::No, &mut sc);
50
51        vd.field_bool("succession");
52
53        vd.field_script_value_rooted("candidate_score", Scopes::Character);
54        // TODO: "Please avoid circular dependencies and don't use aptitude for mandate qualifications"
55        vd.field_script_value_rooted("aptitude_score", Scopes::Character);
56        vd.field_script_value_rooted("loyalty_score", Scopes::Character);
57
58        vd.multi_field_item("mandate", Item::DiarchyMandate);
59
60        vd.multi_field_validated_block("power_level", |block, data| {
61            let mut vd = Validator::new(block, data);
62            vd.field_integer("swing");
63            vd.multi_field_item("parameter", Item::Localization);
64            vd.multi_field_value("hidden_parameter");
65        });
66        vd.field_script_value_rooted("swing_balance", Scopes::Character);
67
68        vd.field_item("end_interaction", Item::CharacterInteraction);
69
70        vd.multi_field_validated_block("liege_modifier", |block, data| {
71            let mut vd = Validator::new(block, data);
72            vd.field_item("name", Item::Localization);
73            vd.field_script_value_rooted("scale", Scopes::Character);
74            validate_modifs(block, data, ModifKinds::Character, vd);
75        });
76        vd.multi_field_validated_block("diarch_modifier", |block, data| {
77            let mut vd = Validator::new(block, data);
78            vd.field_item("name", Item::Localization);
79            vd.field_script_value_rooted("scale", Scopes::Character);
80            validate_modifs(block, data, ModifKinds::Character, vd);
81        });
82    }
83}
84
85#[derive(Clone, Debug)]
86pub struct DiarchyMandate {}
87
88inventory::submit! {
89    ItemLoader::Normal(GameFlags::Ck3, Item::DiarchyMandate, DiarchyMandate::add)
90}
91
92impl DiarchyMandate {
93    pub fn add(db: &mut Db, key: Token, block: Block) {
94        db.add(Item::DiarchyMandate, key, block, Box::new(Self {}));
95    }
96}
97
98impl DbKind for DiarchyMandate {
99    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
100        let mut vd = Validator::new(block, data);
101
102        let loca = format!("{key}_mandate");
103        data.verify_exists_implied(Item::Localization, &loca, key);
104        let loca = format!("{key}_mandate_desc");
105        data.verify_exists_implied(Item::Localization, &loca, key);
106
107        vd.field_script_value_rooted("qualification_score", Scopes::Character);
108        vd.field_script_value_rooted("ai_score", Scopes::Character);
109    }
110}