tiger_lib/vic3/data/
state_regions.rs1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader};
6use crate::token::Token;
7use crate::validator::Validator;
8
9#[derive(Clone, Debug)]
10pub struct StateRegion {}
11
12inventory::submit! {
13 ItemLoader::Normal(GameFlags::Vic3, Item::StateRegion, StateRegion::add)
14}
15
16impl StateRegion {
17 pub fn add(db: &mut Db, key: Token, block: Block) {
18 db.add(Item::StateRegion, key, block, Box::new(Self {}));
19 }
20}
21
22impl DbKind for StateRegion {
23 fn validate(&self, key: &Token, block: &Block, data: &Everything) {
24 let mut vd = Validator::new(block, data);
25
26 data.verify_exists(Item::Localization, key);
27
28 vd.req_field("id");
29 vd.field_integer("id"); vd.req_field("provinces");
31 vd.field_list_items("provinces", Item::Province);
32
33 vd.field_item("subsistence_building", Item::BuildingType);
35 vd.field_item("graphical_culture", Item::Culture);
36
37 for hub in &["city", "port", "mine", "farm", "wood"] {
39 if vd.field_item(hub, Item::Province) {
41 let loca = format!("HUB_NAME_{key}_{hub}");
42 data.verify_exists_implied(Item::Localization, &loca, key);
43 }
44 }
45
46 vd.field_integer("arable_land");
47 vd.field_list_items("arable_resources", Item::BuildingType);
48 vd.field_validated_block("capped_resources", |block, data| {
49 let mut vd = Validator::new(block, data);
50 vd.unknown_value_fields(|key, value| {
51 data.verify_exists(Item::BuildingType, key);
52 value.expect_integer();
53 });
54 });
55 vd.multi_field_validated_block("resource", |block, data| {
56 let mut vd = Validator::new(block, data);
57 vd.req_field("type");
58 vd.field_item("type", Item::BuildingType);
59 vd.field_item("depleted_type", Item::BuildingType);
60 vd.field_integer("amount");
61 vd.field_integer("undiscovered_amount");
62 vd.field_integer("discovered_amount");
63 vd.field_integer("depleted_amount");
64 vd.field_numeric("discover_chance_mult");
65 vd.field_numeric("deplete_chance_mult");
66 });
67
68 vd.multi_field_list_items("traits", Item::StateTrait);
69
70 vd.field_value("naval_exit_id"); vd.field_list_items("impassable", Item::Province);
74 vd.field_list_items("prime_land", Item::Province);
75 vd.field_item("center_province", Item::Province);
76
77 vd.field_validated_block("blockade_locator", |block, data| {
78 let mut vd = Validator::new(block, data);
79 vd.field_list_numeric_exactly("position", 3);
80 vd.field_numeric("yaw");
81 });
82 vd.field_numeric("diorama_radius_multiplier");
83 vd.field_list_numeric_exactly("diorama_center_offset", 2);
84 }
85}