tiger_lib/ck3/data/
amenities.rs

1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::ck3::validate::validate_cost;
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::report::{err, ErrorKey};
10use crate::scopes::Scopes;
11use crate::token::Token;
12use crate::tooltipped::Tooltipped;
13use crate::validator::Validator;
14
15#[derive(Clone, Debug)]
16pub struct Amenity {}
17
18inventory::submit! {
19    ItemLoader::Normal(GameFlags::Ck3, Item::Amenity, Amenity::add)
20}
21
22impl Amenity {
23    pub fn add(db: &mut Db, key: Token, block: Block) {
24        db.add(Item::Amenity, key, block, Box::new(Self {}));
25    }
26}
27
28impl DbKind for Amenity {
29    fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
30        for (key, block) in block.iter_definitions() {
31            db.add(Item::AmenitySetting, key.clone(), block.clone(), Box::new(AmenitySetting {}));
32        }
33    }
34
35    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
36        let mut vd = Validator::new(block, data);
37        if let Some(value) = vd.field_value("default") {
38            if !block.has_key(value.as_str()) {
39                err(ErrorKey::MissingItem).msg("default not found in amenity").loc(value).push();
40            }
41        }
42        // validated in AmenitySetting::validate
43        vd.unknown_block_fields(|_, _| {});
44    }
45}
46
47#[derive(Clone, Debug)]
48pub struct AmenitySetting {}
49
50impl DbKind for AmenitySetting {
51    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
52        let mut vd = Validator::new(block, data);
53        data.verify_exists(Item::Localization, key);
54
55        vd.field_validated_block_rooted("cost", Scopes::Character, validate_cost);
56
57        vd.field_validated_block("owner_modifier", |block, data| {
58            let vd = Validator::new(block, data);
59            validate_modifs(block, data, ModifKinds::Character, vd);
60        });
61        vd.field_item("owner_modifier_description", Item::Localization);
62
63        vd.field_validated_block("courtier_guest_modifier", |block, data| {
64            let vd = Validator::new(block, data);
65            validate_modifs(block, data, ModifKinds::Character, vd);
66        });
67        vd.field_item("courtier_guest_modifier_description", Item::Localization);
68
69        vd.field_script_value_rooted("ai_will_do", Scopes::Character);
70        vd.field_trigger_rooted("can_pick", Tooltipped::Yes, Scopes::Character);
71    }
72}