Skip to main content

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("religion");
38            vd.req_field("culture");
39            vd.req_field("female");
40            vd.req_field("home_region");
41            vd.req_field("holding_type");
42            vd.req_field("dna");
43            vd.req_field("age");
44            vd.req_field("interest_group");
45            vd.req_field("commander_rank");
46            vd.req_field("trait_generation");
47        }
48
49        vd.field_validated_value("first_name", |_, mut vd| {
50            vd.maybe_is("culture");
51            vd.item(Item::Localization);
52        });
53        vd.field_validated_value("last_name", |_, mut vd| {
54            vd.maybe_is("culture");
55            vd.item(Item::Localization);
56        });
57
58        vd.field_bool("historical");
59        vd.field_bool("noble");
60        vd.field_bool("female");
61
62        vd.field_validated_value("culture", |_, mut vd| {
63            vd.maybe_is("primary_culture");
64            vd.maybe_is("random_accepted");
65            vd.maybe_is("random");
66            vd.maybe_is("ig_before_primary_culture");
67            vd.maybe_is("ig_before_random_accepted");
68            vd.maybe_is("ig_before_random");
69            vd.target(&mut sc, Scopes::Culture);
70        });
71        vd.field_validated_value("religion", |_, mut vd| {
72            vd.maybe_is("random_accepted");
73            vd.maybe_is("random");
74            vd.item_or_target(&mut sc, Item::Religion, Scopes::Religion);
75        });
76
77        vd.field_validated_value("home_region", |_, mut vd| {
78            vd.maybe_is("random");
79            vd.item_or_target(&mut sc, Item::StateRegion, Scopes::StateRegion);
80        });
81        vd.field_validated_value("holding_type", |_, mut vd| {
82            vd.maybe_is("random");
83            vd.item_or_target(&mut sc, Item::BuildingType, Scopes::BuildingType);
84        });
85
86        vd.field_validated_value("dna", |_, mut vd| {
87            vd.maybe_is("random");
88            vd.item(Item::Dna);
89        });
90        vd.field_validated_value("age", |_, mut vd| {
91            vd.maybe_is("default");
92            vd.integer();
93        });
94        vd.field_validated_value("interest_group", |_, mut vd| {
95            vd.maybe_is("random");
96            vd.maybe_item(Item::InterestGroup);
97            vd.target(&mut sc, Scopes::InterestGroup);
98        });
99        vd.field_item("ideology", Item::Ideology);
100
101        vd.field_bool("is_general");
102        vd.field_bool("is_admiral");
103        vd.field_item("hq", Item::StrategicRegion);
104        vd.field_validated_value("commander_rank", |_, mut vd| {
105            vd.maybe_is("default");
106            vd.item(Item::CommanderRank);
107        });
108        vd.field_validated_value("role", |_, mut vd| {
109            vd.maybe_item(Item::CharacterArchetype);
110            vd.item(Item::CharacterRole);
111        });
112
113        vd.field_bool("ruler");
114        vd.field_bool("heir");
115        vd.field_bool("ig_leader");
116        vd.field_bool("is_agitator");
117
118        vd.field_date("birth_date");
119        vd.field_list_items("traits", Item::CharacterTrait);
120
121        // TODO: "should only be used for traits"
122        vd.field_effect_rooted("trait_generation", Tooltipped::No, Scopes::Character);
123        vd.field_effect_rooted("on_created", Tooltipped::No, Scopes::Character);
124
125        vd.field_validated_block("commander_usage", |block, data| {
126            let mut vd = Validator::new(block, data);
127            vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
128            vd.field_choice("role", &["general", "admiral"]);
129            vd.field_date("earliest_usage_date");
130            vd.field_date("latest_usage_date");
131            vd.field_numeric_range("chance", 0.0..=100.0);
132        });
133
134        for field in &["interest_group_leader_usage", "agitator_usage"] {
135            vd.field_validated_block(field, |block, data| {
136                let mut vd = Validator::new(block, data);
137                vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
138                vd.field_trigger_rooted(
139                    "interest_group_trigger",
140                    Tooltipped::No,
141                    Scopes::InterestGroup,
142                );
143                vd.field_date("earliest_usage_date");
144                vd.field_date("latest_usage_date");
145                vd.field_numeric_range("chance", 0.0..=100.0);
146            });
147        }
148
149        vd.field_validated_block("executive_usage", |block, data| {
150            let mut vd = Validator::new(block, data);
151            vd.field_trigger_rooted("country_trigger", Tooltipped::No, Scopes::Country);
152            vd.field_trigger_rooted("company_trigger", Tooltipped::No, Scopes::Company);
153            vd.field_date("earliest_usage_date");
154            vd.field_date("latest_usage_date");
155            vd.field_numeric_range("chance", 0.0..=100.0);
156        });
157
158        // undocumented
159        vd.field_target("company", &mut sc, Scopes::CompanyType);
160        vd.field_bool("is_for_ruler_selector");
161    }
162}