tiger_lib/ck3/data/
lines.rs

1use crate::block::{BV, Block};
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader, LoadAsFile, Recursive};
6use crate::pdxfile::PdxEncoding;
7use crate::report::{ErrorKey, err};
8use crate::token::Token;
9use crate::validate::validate_color;
10use crate::validator::Validator;
11
12#[derive(Clone, Debug)]
13pub struct LineType {}
14
15inventory::submit! {
16    ItemLoader::Full(GameFlags::Ck3, Item::LineType, PdxEncoding::Utf8Bom, ".lines", LoadAsFile::No, Recursive::No, LineType::add)
17}
18
19impl LineType {
20    pub fn add(db: &mut Db, key: Token, block: Block) {
21        if key.is("line") {
22            if let Some(name) = block.get_field_value("name") {
23                db.add(Item::LineType, name.clone(), block, Box::new(Self {}));
24            } else {
25                let msg = "line without name";
26                err(ErrorKey::FieldMissing).msg(msg).loc(key).push();
27            }
28        } else {
29            let msg = "unexpected key";
30            let info = "expected only `line`";
31            err(ErrorKey::UnknownField).msg(msg).info(info).loc(key).push();
32        }
33    }
34}
35
36impl DbKind for LineType {
37    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
38        let mut vd = Validator::new(block, data);
39
40        vd.field_value("name");
41
42        vd.field_numeric_range("curvature", 0.0..=1.0);
43        vd.field_numeric("max_height"); // TODO: possibly this is an int
44        vd.field_numeric("fade_in");
45        vd.field_numeric("fade_out");
46        vd.field_integer("priority");
47        vd.field_numeric("progress_animation_time");
48        vd.field_bool("progress_animation_looping");
49
50        vd.multi_field_validated_block("layer", |block, data| {
51            let mut vd = Validator::new(block, data);
52            vd.field_item("diffuse", Item::File);
53            vd.field_item("normal", Item::File);
54            vd.field_item("mask", Item::File);
55            vd.field_item("properties", Item::File);
56            vd.field_value("shader"); // TODO what are the options here
57            vd.field_value("shadow_shader"); // TODO what are the options here
58            vd.field_integer("priority");
59            vd.field_validated_block("tintcolor", validate_color);
60            vd.field_validated("width", validate_zoom_levels);
61            vd.field_validated("opacity", validate_zoom_levels);
62            vd.field_list_numeric_exactly("mask_uv_scale", 2);
63            vd.field_list_numeric_exactly("uv_scale", 2);
64            vd.field_list_numeric_exactly("animation_speed", 2);
65        });
66    }
67}
68
69fn validate_zoom_levels(bv: &BV, data: &Everything) {
70    match bv {
71        BV::Value(value) => {
72            value.expect_number();
73        }
74        BV::Block(block) => {
75            let mut vd = Validator::new(block, data);
76            for block in vd.blocks() {
77                let mut vd = Validator::new(block, data);
78                vd.field_integer("zoom_step");
79                vd.field_numeric("value");
80            }
81        }
82    }
83}