tiger_lib/vic3/data/
objectives.rs1use 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); vd.field_list_items("objective_subgoals", Item::ObjectiveSubgoal);
41 vd.field_item("final_subgoal", Item::ObjectiveSubgoal); 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}