tiger_lib/ck3/data/
legitimacy.rs

1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::context::ScopeContext;
4use crate::db::{Db, DbKind};
5use crate::game::GameFlags;
6use crate::item::{Item, ItemLoader};
7use crate::modif::validate_modifs;
8use crate::scopes::Scopes;
9use crate::token::Token;
10use crate::tooltipped::Tooltipped;
11use crate::validator::Validator;
12use crate::Everything;
13
14#[derive(Clone, Debug)]
15pub struct LegitimacyType {}
16
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Ck3, Item::LegitimacyType, LegitimacyType::add)
19}
20
21impl LegitimacyType {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::LegitimacyType, key, block, Box::new(Self {}));
24    }
25}
26
27impl DbKind for LegitimacyType {
28    fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
29        for block in &block.get_field_blocks("level") {
30            for &flag in &block.get_field_values("flag") {
31                db.add_flag(Item::LegitimacyFlag, flag.clone());
32            }
33        }
34    }
35
36    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
37        let loca = format!("{key}_type_name");
38        data.verify_exists_implied(Item::Localization, &loca, key);
39
40        let mut vd = Validator::new(block, data);
41        vd.field_trigger_rooted("is_valid", Tooltipped::No, Scopes::Character);
42        vd.field_script_value_no_breakdown_builder("ai_expected_level", |key| {
43            let mut sc = ScopeContext::new(Scopes::Character, key);
44            sc.define_name("liege", Scopes::Character, key);
45            sc
46        });
47        vd.field_script_value_builder("below_expectations_opinion", |key| {
48            let mut sc = ScopeContext::new(Scopes::Character, key);
49            sc.define_name("target", Scopes::Character, key);
50            sc
51        });
52        vd.field_script_value_rooted("max", Scopes::Character);
53        vd.multi_field_validated_block("level", |block, data| {
54            let mut vd = Validator::new(block, data);
55            vd.field_script_value_rooted("threshold", Scopes::Character);
56            vd.field_validated_block("modifier", |block, data| {
57                let vd = Validator::new(block, data);
58                validate_modifs(block, data, ModifKinds::Character, vd);
59            });
60            vd.multi_field_value("flag");
61        });
62    }
63}