tiger_lib/vic3/data/
governments.rs

1use crate::block::Block;
2use crate::context::ScopeContext;
3use crate::db::{Db, DbKind};
4use crate::everything::Everything;
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::vic3::modif::ModifKinds;
13
14#[derive(Clone, Debug)]
15pub struct GovernmentType {}
16
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Vic3, Item::GovernmentType, GovernmentType::add)
19}
20
21impl GovernmentType {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::GovernmentType, key, block, Box::new(Self {}));
24    }
25}
26
27impl DbKind for GovernmentType {
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::Country, key);
31
32        data.verify_exists(Item::Localization, key);
33        let loca = format!("{key}_desc");
34        data.verify_exists_implied(Item::Localization, &loca, key);
35
36        vd.field_item("transfer_of_power", Item::TransferOfPower);
37        vd.field_bool("new_leader_on_reform_government");
38
39        vd.field_item("male_ruler", Item::Localization);
40        vd.field_item("female_ruler", Item::Localization);
41        vd.field_item("male_heir", Item::Localization);
42        vd.field_item("female_heir", Item::Localization);
43
44        vd.field_trigger("possible", Tooltipped::No, &mut sc);
45        vd.field_effect("on_government_type_change", Tooltipped::No, &mut sc);
46        // This uses scopes set in on_government_type_change
47        vd.field_effect("on_post_government_type_change", Tooltipped::No, &mut sc);
48    }
49}
50
51#[derive(Clone, Debug)]
52pub struct LegitimacyLevel {}
53
54inventory::submit! {
55    ItemLoader::Normal(GameFlags::Vic3, Item::LegitimacyLevel, LegitimacyLevel::add)
56}
57
58impl LegitimacyLevel {
59    pub fn add(db: &mut Db, key: Token, block: Block) {
60        db.add(Item::LegitimacyLevel, key, block, Box::new(Self {}));
61    }
62}
63
64impl DbKind for LegitimacyLevel {
65    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
66        // This entire item type is undocumented
67        let mut vd = Validator::new(block, data);
68
69        data.verify_exists(Item::Localization, key);
70
71        vd.field_integer_range("threshold", 0..=100);
72        vd.field_validated_block("modifier", |block, data| {
73            let vd = Validator::new(block, data);
74            validate_modifs(block, data, ModifKinds::Country, vd);
75        });
76        vd.field_script_value_rooted("loyalties_gain", Scopes::Country);
77        if block.has_key("loyalties_gain") {
78            let loca = format!("{key}_loyalties_gain");
79            data.verify_exists_implied(Item::Localization, &loca, key);
80        }
81    }
82}
83
84#[derive(Clone, Debug)]
85pub struct LibertyDesireLevel {}
86
87inventory::submit! {
88    ItemLoader::Normal(GameFlags::Vic3, Item::LibertyDesireLevel, LibertyDesireLevel::add)
89}
90
91impl LibertyDesireLevel {
92    pub fn add(db: &mut Db, key: Token, block: Block) {
93        db.add(Item::LibertyDesireLevel, key, block, Box::new(Self {}));
94    }
95}
96
97impl DbKind for LibertyDesireLevel {
98    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
99        data.verify_exists(Item::Localization, key);
100
101        let mut vd = Validator::new(block, data);
102        vd.field_integer("threshold");
103        vd.field_list_items("valid_sway_wargoals_against_overlord", Item::WarGoalType);
104        vd.field_validated_block("modifier", |block, data| {
105            let vd = Validator::new(block, data);
106            validate_modifs(block, data, ModifKinds::Country, vd);
107        });
108        vd.field_item("background_texture", Item::File);
109    }
110}