tiger_lib/ck3/data/
house_unities.rs1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::db::{Db, DbKind};
4use crate::everything::Everything;
5use crate::game::GameFlags;
6use crate::item::{Item, ItemLoader};
7use crate::modif::validate_modifs;
8use crate::scopes::Scopes;
9use crate::token::Token;
10use crate::tooltipped::Tooltipped;
11use crate::validator::{Validator, ValueValidator};
12
13#[derive(Clone, Debug)]
14pub struct HouseUnity {}
15
16inventory::submit! {
17 ItemLoader::Normal(GameFlags::Ck3, Item::HouseUnity, HouseUnity::add)
18}
19
20impl HouseUnity {
21 pub fn add(db: &mut Db, key: Token, block: Block) {
22 db.add(Item::HouseUnity, key, block, Box::new(Self {}));
23 }
24}
25
26impl DbKind for HouseUnity {
27 fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
28 for (token, block) in block.iter_definitions() {
29 db.add_flag(Item::HouseUnityStage, token.clone());
30
31 if let Some(block) = block.get_field_block("parameters") {
32 for (token, _) in block.iter_assignments() {
33 db.add_flag(Item::HouseUnityParameter, token.clone());
34 }
35 }
36 }
37 }
38
39 fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
40 let mut vd = Validator::new(block, data);
41 vd.req_field("default_value");
42 vd.field_integer("default_value");
43 vd.field_integer("min_value");
44
45 vd.unknown_block_fields(|token, block| {
46 validate_stage(token, block, data);
47 });
48 }
49}
50
51fn validate_stage(key: &Token, block: &Block, data: &Everything) {
52 let mut vd = Validator::new(block, data);
53
54 data.verify_exists(Item::Localization, key);
55 let loca = format!("{key}_desc");
56 data.verify_exists_implied(Item::Localization, &loca, key);
57
58 vd.req_field("points");
59 vd.field_integer("points");
60
61 let icon = vd.field_value("icon").unwrap_or(key);
62 data.verify_icon("NGameIcons|HOUSE_UNITY_STAGE_ICON_PATH", icon, ".dds");
63
64 if let Some(progress_bar_path) =
66 data.get_defined_string_warn(key, "NGameIcons|HOUSE_UNITY_STAGE_PROGRESS_BAR_PATH")
67 {
68 let pathname = format!("{progress_bar_path}/{key}.dds");
69 data.verify_exists_implied(Item::File, &pathname, key);
70 }
71
72 if let Some(background_path) =
74 data.get_defined_string_warn(key, "NGameIcons|HOUSE_UNITY_STAGE_BACKGROUND_PATH")
75 {
76 let pathname = format!("{background_path}/{key}.dds");
77 data.verify_exists_implied(Item::File, &pathname, key);
78 }
79
80 vd.field_validated_block("parameters", |block, data| {
81 let mut vd = Validator::new(block, data);
82 vd.unknown_value_fields(|key, value| {
83 ValueValidator::new(value, data).bool();
84 let loca = format!("house_unity_parameter_{key}");
85 data.verify_exists_implied(Item::Localization, &loca, key);
86 });
87 });
88
89 vd.field_validated_block("modifiers", |block, data| {
90 let vd = Validator::new(block, data);
91 validate_modifs(block, data, ModifKinds::Character, vd);
92 });
93
94 vd.field_effect_rooted("on_start", Tooltipped::No, Scopes::DynastyHouse);
95 vd.field_effect_rooted("on_end", Tooltipped::No, Scopes::DynastyHouse);
96
97 vd.field_list_items("decisions", Item::Decision);
98
99 vd.field_item("succession_law_flag", Item::LawFlag);
101}