tiger_lib/ck3/data/
dynasty_legacies.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 DynastyLegacy {}
16
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Ck3, Item::DynastyLegacy, DynastyLegacy::add)
19}
20
21impl DynastyLegacy {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::DynastyLegacy, key, block, Box::new(Self {}));
24    }
25}
26
27impl DbKind for DynastyLegacy {
28    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
29        let mut vd = Validator::new(block, data);
30        let mut sc = ScopeContext::new(Scopes::Character, key);
31
32        let loca = format!("{key}_name");
33        data.verify_exists_implied(Item::Localization, &loca, key);
34        let loca = format!("{key}_desc");
35        data.verify_exists_implied(Item::Localization, &loca, key);
36
37        if let Some(path) = data.get_defined_string_warn(key, "NGameIcons|LEGACY_TRACK_ICON_PATH") {
38            let pathname = format!("{path}/{key}.dds");
39            data.verify_exists_implied(Item::File, &pathname, key);
40        }
41        if let Some(path) = data.get_defined_string_warn(key, "NGameIcons|LEGACY_ICON_PATH") {
42            let pathname = format!("{path}/{key}.dds");
43            data.verify_exists_implied(Item::File, &pathname, key);
44        }
45
46        vd.field_trigger("is_shown", Tooltipped::No, &mut sc);
47    }
48}
49
50#[derive(Clone, Debug)]
51pub struct DynastyPerk {}
52
53inventory::submit! {
54    ItemLoader::Normal(GameFlags::Ck3, Item::DynastyPerk, DynastyPerk::add)
55}
56
57impl DynastyPerk {
58    pub fn add(db: &mut Db, key: Token, block: Block) {
59        db.add(Item::DynastyPerk, key, block, Box::new(Self {}));
60    }
61}
62
63impl DbKind for DynastyPerk {
64    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
65        let mut vd = Validator::new(block, data);
66        let mut sc = ScopeContext::new(Scopes::Character, key);
67
68        let loca = format!("{key}_name");
69        data.verify_exists_implied(Item::Localization, &loca, key);
70
71        vd.field_item("legacy", Item::DynastyLegacy);
72
73        vd.field_trigger("can_be_picked", Tooltipped::Yes, &mut sc);
74        vd.field_effect("effect", Tooltipped::Yes, &mut sc);
75
76        vd.multi_field_validated_block("character_modifier", |block, data| {
77            let mut vd = Validator::new(block, data);
78            vd.field_item("name", Item::Localization);
79            validate_modifs(block, data, ModifKinds::Character, vd);
80        });
81        vd.multi_field_validated_block("doctrine_character_modifier", |block, data| {
82            let mut vd = Validator::new(block, data);
83            vd.field_item("name", Item::Localization);
84            vd.field_item("doctrine", Item::Doctrine);
85            validate_modifs(block, data, ModifKinds::Character, vd);
86        });
87
88        vd.advice_field("unlock_maa", "removed in 1.16");
89        vd.field_item("trait", Item::Trait);
90        vd.field_validated_block("traits", |block, data| {
91            let mut vd = Validator::new(block, data);
92            vd.unknown_value_fields(|key, value| {
93                data.verify_exists(Item::Trait, key);
94                value.expect_integer();
95            });
96        });
97
98        vd.field_script_value_no_breakdown("ai_chance", &mut sc);
99    }
100}