tiger_lib/vic3/data/
mobilization.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 MobilizationOption {}
16
17inventory::submit! {
18    ItemLoader::Normal(GameFlags::Vic3, Item::MobilizationOption, MobilizationOption::add)
19}
20
21impl MobilizationOption {
22    pub fn add(db: &mut Db, key: Token, block: Block) {
23        db.add(Item::MobilizationOption, key, block, Box::new(Self {}));
24    }
25}
26
27impl DbKind for MobilizationOption {
28    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
29        fn sc_builder(key: &Token) -> ScopeContext {
30            let mut sc = ScopeContext::new(Scopes::Country, key);
31            sc.define_name("military_formation", Scopes::MilitaryFormation, key);
32            sc
33        }
34
35        let mut vd = Validator::new(block, data);
36
37        data.verify_exists(Item::Localization, key);
38        let loca = format!("{key}_desc");
39        data.verify_exists_implied(Item::Localization, &loca, key);
40
41        vd.field_choice("military_formation_type", &["army"]);
42        vd.field_item("group", Item::MobilizationOptionGroup);
43
44        vd.field_item("texture", Item::File);
45
46        vd.multi_field_list_items("unlocking_technologies", Item::Technology);
47        vd.multi_field_list_items("unlocking_laws", Item::LawType);
48        vd.multi_field_list_items("unlocking_principles", Item::Principle); // undocumented
49
50        vd.field_trigger_builder("is_shown", Tooltipped::No, sc_builder);
51        vd.field_trigger_builder("possible", Tooltipped::Yes, sc_builder);
52        vd.field_trigger_builder("can_be_turned_off", Tooltipped::Yes, sc_builder);
53
54        for field in &[
55            "on_activate",
56            "on_deactivate",
57            "on_activate_while_mobilized",
58            "on_deactivate_while_mobilized",
59        ] {
60            vd.field_effect_rooted(field, Tooltipped::Yes, Scopes::MilitaryFormation);
61        }
62
63        vd.field_validated_block("upkeep_modifier", |block, data| {
64            let vd = Validator::new(block, data);
65            validate_modifs(block, data, ModifKinds::Goods, vd);
66        });
67        vd.field_validated_block("upkeep_modifier_unscaled", |block, data| {
68            let vd = Validator::new(block, data);
69            validate_modifs(block, data, ModifKinds::Goods, vd);
70        });
71        vd.field_validated_block("unit_modifier", |block, data| {
72            let vd = Validator::new(block, data);
73            validate_modifs(block, data, ModifKinds::MilitaryFormation, vd);
74        });
75
76        // Docs say it's Militaryformation, but the only example in vanilla contradicts that.
77        vd.field_script_value_no_breakdown_builder("ai_weight", sc_builder);
78    }
79}
80
81#[derive(Clone, Debug)]
82pub struct MobilizationOptionGroup {}
83
84inventory::submit! {
85    ItemLoader::Normal(GameFlags::Vic3, Item::MobilizationOptionGroup, MobilizationOptionGroup::add)
86}
87
88impl MobilizationOptionGroup {
89    pub fn add(db: &mut Db, key: Token, block: Block) {
90        db.add(Item::MobilizationOptionGroup, key, block, Box::new(Self {}));
91    }
92}
93
94impl DbKind for MobilizationOptionGroup {
95    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
96        let mut vd = Validator::new(block, data);
97
98        data.verify_exists(Item::Localization, key);
99        let loca = format!("{key}_desc");
100        data.verify_exists_implied(Item::Localization, &loca, key);
101
102        vd.field_item("icon", Item::File);
103        vd.field_numeric("weight");
104    }
105}