tiger_lib/ck3/data/
succession.rs

1use crate::block::Block;
2use crate::context::ScopeContext;
3use crate::db::{Db, DbKind};
4use crate::everything::Everything;
5use crate::game::GameFlags;
6use crate::item::{Item, ItemLoader};
7use crate::scopes::Scopes;
8use crate::token::Token;
9use crate::validator::Validator;
10
11#[derive(Clone, Debug)]
12pub struct SuccessionAppointment {}
13
14inventory::submit! {
15    ItemLoader::Normal(GameFlags::Ck3, Item::SuccessionAppointment, SuccessionAppointment::add)
16}
17
18impl SuccessionAppointment {
19    pub fn add(db: &mut Db, key: Token, block: Block) {
20        db.add(Item::SuccessionAppointment, key, block, Box::new(Self {}));
21    }
22}
23
24impl DbKind for SuccessionAppointment {
25    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
26        let mut vd = Validator::new(block, data);
27        let mut sc = ScopeContext::new(Scopes::Character, key);
28        sc.define_name("title", Scopes::LandedTitle, key);
29
30        vd.field_script_value("candidate_score", &mut sc);
31        vd.field_list_choice("default_candidates", CANDIDATE_TYPES);
32        vd.advice_field("invested_candidates", "removed in 1.18");
33        vd.field_choice("level", &["merit", "prestige", "piety", "influence"]);
34
35        vd.field_bool("allow_children");
36        vd.field_bool("allow_same_tier_candidates");
37    }
38}
39
40const CANDIDATE_TYPES: &[&str] = &[
41    "holder_close_family",
42    "holder_close_extended_family",
43    "holder_house_member",
44    "landed_vassal",
45    "landed_vassal_close_family",
46    "landed_vassal_close_extended_family",
47    "landed_vassal_house_member",
48    "unlanded_noble_house_head",
49    "unlanded_noble_close_family",
50    "unlanded_noble_close_extended_family",
51    "unlanded_noble_house_member",
52    "holder_councilor",
53    "holder_court_position",
54    "direct_subject",
55    // undocumented
56    "direct_landed_vassal",
57];