tiger_lib/ck3/data/
lines.rs1use 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"); 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"); vd.field_value("shadow_shader"); 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}