tiger_lib/vic3/data/
governments.rs1use 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 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 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}