tiger_lib/vic3/data/
scripted_progress_bars.rs

1use crate::block::Block;
2use crate::context::ScopeContext;
3use crate::db::{Db, DbKind};
4use crate::desc::validate_desc;
5use crate::everything::Everything;
6use crate::game::GameFlags;
7use crate::item::{Item, ItemLoader};
8use crate::scopes::Scopes;
9use crate::token::Token;
10use crate::validator::Validator;
11
12#[derive(Clone, Debug)]
13pub struct ScriptedProgressBar {}
14
15inventory::submit! {
16    ItemLoader::Normal(GameFlags::Vic3, Item::ScriptedProgressBar, ScriptedProgressBar::add)
17}
18
19impl ScriptedProgressBar {
20    pub fn add(db: &mut Db, key: Token, block: Block) {
21        db.add(Item::ScriptedProgressBar, key, block, Box::new(Self {}));
22    }
23}
24
25const BAR_TYPES: &[&str] = &[
26    "default",
27    "default_green",
28    "default_bad",
29    "double_sided_gold",
30    "double_sided_bad",
31    // undocumented
32    "double_sided_two_spains",
33];
34
35impl DbKind for ScriptedProgressBar {
36    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
37        let mut vd = Validator::new(block, data);
38        let mut sc = ScopeContext::new(Scopes::JournalEntry, key);
39
40        vd.req_field("name");
41        vd.field_validated_sc("name", &mut sc, validate_desc);
42        vd.req_field("desc");
43        vd.field_validated_sc("desc", &mut sc, validate_desc);
44        vd.field_validated_sc("second_desc", &mut sc, validate_desc);
45
46        vd.field_bool("is_inverted");
47
48        vd.field_numeric("start_value");
49        vd.field_numeric("min_value");
50        vd.field_numeric("max_value");
51
52        vd.req_field_one_of(BAR_TYPES);
53        for field in BAR_TYPES {
54            vd.field_bool(field);
55        }
56
57        for field in &["weekly_progress", "monthly_progress", "yearly_progress"] {
58            vd.field_script_value_rooted(field, Scopes::Country);
59        }
60    }
61}