tiger_lib/vic3/data/
objectives.rs

1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader};
6use crate::scopes::Scopes;
7use crate::token::Token;
8use crate::tooltipped::Tooltipped;
9use crate::validator::Validator;
10
11#[derive(Clone, Debug)]
12pub struct Objective {}
13
14inventory::submit! {
15    ItemLoader::Normal(GameFlags::Vic3, Item::Objective, Objective::add)
16}
17
18impl Objective {
19    pub fn add(db: &mut Db, key: Token, block: Block) {
20        db.add(Item::Objective, key, block, Box::new(Self {}));
21    }
22}
23
24impl DbKind for Objective {
25    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
26        let mut vd = Validator::new(block, data);
27
28        data.verify_exists(Item::Localization, key);
29        let loca = format!("{key}_desc");
30        data.verify_exists_implied(Item::Localization, &loca, key);
31
32        vd.field_item("icon", Item::File);
33        vd.replaced_field("background", "enabled_background and disabled_background");
34        vd.field_item("enabled_background", Item::File);
35        vd.field_item("disabled_background", Item::File);
36
37        vd.field_list_items("recommended_tags", Item::Country);
38        vd.field_bool("available_for_all_countries");
39        vd.field_list_items("recommended_game_rules", Item::GameRuleSetting); // undocumented
40        vd.field_list_items("objective_subgoals", Item::ObjectiveSubgoal);
41        // TODO: check if it's in the list above?
42        vd.field_item("final_subgoal", Item::ObjectiveSubgoal); // undocumented
43
44        vd.field_effect_rooted("on_start", Tooltipped::No, Scopes::Country);
45        vd.field_item("required_dlc_feature", Item::DlcFeature);
46    }
47}
48
49#[derive(Clone, Debug)]
50pub struct ObjectiveSubgoal {}
51
52inventory::submit! {
53    ItemLoader::Normal(GameFlags::Vic3, Item::ObjectiveSubgoal, ObjectiveSubgoal::add)
54}
55
56impl ObjectiveSubgoal {
57    pub fn add(db: &mut Db, key: Token, block: Block) {
58        db.add(Item::ObjectiveSubgoal, key, block, Box::new(Self {}));
59    }
60}
61
62impl DbKind for ObjectiveSubgoal {
63    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
64        let mut vd = Validator::new(block, data);
65
66        vd.field_item("category", Item::ObjectiveSubgoalCategory);
67        vd.field_bool("is_repeatable");
68
69        vd.field_list_items("unlocking_subgoals_all", Item::ObjectiveSubgoal);
70        vd.field_list_items("unlocking_subgoals_any", Item::ObjectiveSubgoal);
71        vd.field_list_items("blocking_subgoals_none_of", Item::ObjectiveSubgoal);
72        vd.field_list_items("blocking_subgoals_not_all", Item::ObjectiveSubgoal);
73
74        vd.field_trigger_rooted("trigger", Tooltipped::No, Scopes::Country);
75        vd.field_script_value_rooted("chance", Scopes::Country);
76        vd.field_effect_rooted("on_start", Tooltipped::No, Scopes::Country);
77    }
78}
79
80#[derive(Clone, Debug)]
81pub struct ObjectiveSubgoalCategory {}
82
83inventory::submit! {
84    ItemLoader::Normal(GameFlags::Vic3, Item::ObjectiveSubgoalCategory, ObjectiveSubgoalCategory::add)
85}
86
87impl ObjectiveSubgoalCategory {
88    pub fn add(db: &mut Db, key: Token, block: Block) {
89        db.add(Item::ObjectiveSubgoalCategory, key, block, Box::new(Self {}));
90    }
91}
92
93impl DbKind for ObjectiveSubgoalCategory {
94    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
95        let mut vd = Validator::new(block, data);
96
97        vd.field_bool("is_exclusive");
98        vd.field_bool("is_repeatable");
99    }
100}