tiger_lib/vic3/data/
character_templates.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::tooltipped::Tooltipped;
10use crate::validator::Validator;
11
12#[derive(Clone, Debug)]
13pub struct CharacterTemplate {}
14
15inventory::submit! {
16    ItemLoader::Normal(GameFlags::Vic3, Item::CharacterTemplate, CharacterTemplate::add)
17}
18
19impl CharacterTemplate {
20    pub fn add(db: &mut Db, key: Token, block: Block) {
21        db.add(Item::CharacterTemplate, key, block, Box::new(Self {}));
22    }
23}
24
25// TODO: check that the "default" template exists
26
27impl DbKind for CharacterTemplate {
28    fn validate(&self, key: &Token, block: &Block, data: &Everything) {
29        let mut vd = Validator::new(block, data);
30        let mut sc = ScopeContext::new(Scopes::Country, key);
31
32        if key.is("default") {
33            // The default template must have all these fields filled out.
34            vd.req_field("first_name");
35            vd.req_field("last_name");
36            vd.req_field("historical");
37            vd.req_field("culture");
38            vd.req_field("female");
39            vd.req_field("dna");
40            vd.req_field("age");
41            vd.req_field("interest_group");
42            vd.req_field("commander_rank");
43            vd.req_field("trait_generation");
44        }
45
46        vd.field_validated_value("first_name", |_, mut vd| {
47            vd.maybe_is("culture");
48            vd.item(Item::Localization);
49        });
50        vd.field_validated_value("last_name", |_, mut vd| {
51            vd.maybe_is("culture");
52            vd.item(Item::Localization);
53        });
54
55        vd.field_bool("historical");
56        vd.field_bool("noble");
57        vd.field_bool("female");
58
59        vd.field_validated_value("culture", |_, mut vd| {
60            vd.maybe_is("primary_culture");
61            vd.maybe_is("ig_before_primary_culture");
62            vd.target(&mut sc, Scopes::Culture);
63        });
64        vd.field_validated_value("religion", |_, mut vd| {
65            vd.maybe_is("random");
66            vd.item_or_target(&mut sc, Item::Religion, Scopes::Religion);
67        });
68
69        vd.field_validated_value("dna", |_, mut vd| {
70            vd.maybe_is("random");
71            vd.item(Item::Dna);
72        });
73        vd.field_validated_value("age", |_, mut vd| {
74            vd.maybe_is("default");
75            vd.integer();
76        });
77        vd.field_validated_value("interest_group", |_, mut vd| {
78            vd.maybe_is("random");
79            vd.maybe_item(Item::InterestGroup);
80            vd.target(&mut sc, Scopes::InterestGroup);
81        });
82        vd.field_item("ideology", Item::Ideology);
83
84        vd.field_bool("is_general");
85        vd.field_bool("is_admiral");
86        vd.field_item("hq", Item::StrategicRegion);
87        vd.field_validated_value("commander_rank", |_, mut vd| {
88            vd.maybe_is("default");
89            vd.item(Item::CommanderRank);
90        });
91        vd.field_bool("ruler");
92        vd.field_bool("heir");
93        vd.field_bool("ig_leader");
94        vd.field_bool("is_agitator");
95
96        vd.field_date("birth_date");
97        vd.field_list_items("traits", Item::CharacterTrait);
98
99        // TODO: "should only be used for traits"
100        vd.field_effect_rooted("trait_generation", Tooltipped::No, Scopes::Character);
101        vd.field_effect_rooted("on_created", Tooltipped::No, Scopes::Character);
102
103        vd.field_validated_block("commander_usage", |block, data| {
104            let mut vd = Validator::new(block, data);
105            vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
106            vd.field_choice("role", &["general", "admiral"]);
107            vd.field_date("earliest_usage_date");
108            vd.field_date("latest_usage_date");
109            vd.field_numeric_range("chance", 0.0..=100.0);
110        });
111
112        for field in &["interest_group_leader_usage", "agitator_usage"] {
113            vd.field_validated_block(field, |block, data| {
114                let mut vd = Validator::new(block, data);
115                vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
116                vd.field_trigger_rooted(
117                    "interest_group_trigger",
118                    Tooltipped::No,
119                    Scopes::InterestGroup,
120                );
121                vd.field_date("earliest_usage_date");
122                vd.field_date("latest_usage_date");
123                vd.field_numeric_range("chance", 0.0..=100.0);
124            });
125        }
126
127        vd.field_validated_block("executive_usage", |block, data| {
128            let mut vd = Validator::new(block, data);
129            vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
130            vd.field_trigger_rooted("company_trigger", Tooltipped::No, Scopes::Company);
131            vd.field_date("earliest_usage_date");
132            vd.field_date("latest_usage_date");
133            vd.field_numeric_range("chance", 0.0..=100.0);
134        });
135    }
136}