tiger_lib/ck3/data/
diarchies.rs1use crate::block::Block;
2use crate::ck3::modif::ModifKinds;
3use crate::context::ScopeContext;
4use crate::db::{Db, DbKind};
5use crate::everything::Everything;
6use crate::game::GameFlags;
7use crate::item::{Item, ItemLoader};
8use crate::modif::validate_modifs;
9use crate::scopes::Scopes;
10use crate::token::Token;
11use crate::tooltipped::Tooltipped;
12use crate::validator::Validator;
13
14#[derive(Clone, Debug)]
15pub struct DiarchyType {}
16
17inventory::submit! {
18 ItemLoader::Normal(GameFlags::Ck3, Item::DiarchyType, DiarchyType::add)
19}
20
21impl DiarchyType {
22 pub fn add(db: &mut Db, key: Token, block: Block) {
23 db.add(Item::DiarchyType, key, block, Box::new(Self {}));
24 }
25}
26
27impl DbKind for DiarchyType {
28 fn add_subitems(&self, _key: &Token, block: &Block, db: &mut Db) {
29 for block in block.get_field_blocks("power_level") {
30 for token in block.get_field_values("parameter") {
31 db.add_flag(Item::DiarchyParameter, token.clone());
32 }
33 for token in block.get_field_values("hidden_parameter") {
34 db.add_flag(Item::DiarchyParameter, token.clone());
35 }
36 }
37 }
38
39 fn validate(&self, key: &Token, block: &Block, data: &Everything) {
40 let mut vd = Validator::new(block, data);
41 let mut sc = ScopeContext::new(Scopes::Character, key);
42
43 let loca = format!("{key}_diarchy_type");
44 data.verify_exists_implied(Item::Localization, &loca, key);
45 let loca = format!("{key}_diarch_title");
46 data.verify_exists_implied(Item::Localization, &loca, key);
47
48 vd.field_trigger("start", Tooltipped::No, &mut sc);
49 vd.field_trigger("end", Tooltipped::No, &mut sc);
50
51 vd.field_bool("succession");
52
53 vd.field_script_value_rooted("candidate_score", Scopes::Character);
54 vd.field_script_value_rooted("aptitude_score", Scopes::Character);
56 vd.field_script_value_rooted("loyalty_score", Scopes::Character);
57
58 vd.multi_field_item("mandate", Item::DiarchyMandate);
59
60 vd.multi_field_validated_block("power_level", |block, data| {
61 let mut vd = Validator::new(block, data);
62 vd.field_integer("swing");
63 vd.multi_field_item("parameter", Item::Localization);
64 vd.multi_field_value("hidden_parameter");
65 });
66 vd.field_script_value_rooted("swing_balance", Scopes::Character);
67
68 vd.field_item("end_interaction", Item::CharacterInteraction);
69
70 vd.multi_field_validated_block("liege_modifier", |block, data| {
71 let mut vd = Validator::new(block, data);
72 vd.field_item("name", Item::Localization);
73 vd.field_script_value_rooted("scale", Scopes::Character);
74 validate_modifs(block, data, ModifKinds::Character, vd);
75 });
76 vd.multi_field_validated_block("diarch_modifier", |block, data| {
77 let mut vd = Validator::new(block, data);
78 vd.field_item("name", Item::Localization);
79 vd.field_script_value_rooted("scale", Scopes::Character);
80 validate_modifs(block, data, ModifKinds::Character, vd);
81 });
82 }
83}
84
85#[derive(Clone, Debug)]
86pub struct DiarchyMandate {}
87
88inventory::submit! {
89 ItemLoader::Normal(GameFlags::Ck3, Item::DiarchyMandate, DiarchyMandate::add)
90}
91
92impl DiarchyMandate {
93 pub fn add(db: &mut Db, key: Token, block: Block) {
94 db.add(Item::DiarchyMandate, key, block, Box::new(Self {}));
95 }
96}
97
98impl DbKind for DiarchyMandate {
99 fn validate(&self, key: &Token, block: &Block, data: &Everything) {
100 let mut vd = Validator::new(block, data);
101
102 let loca = format!("{key}_mandate");
103 data.verify_exists_implied(Item::Localization, &loca, key);
104 let loca = format!("{key}_mandate_desc");
105 data.verify_exists_implied(Item::Localization, &loca, key);
106
107 vd.field_script_value_rooted("qualification_score", Scopes::Character);
108 vd.field_script_value_rooted("ai_score", Scopes::Character);
109 }
110}