tiger_lib/vic3/data/
character_templates.rs1use 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
25impl 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 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 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 vd.field_target("company", &mut sc, Scopes::CompanyType);
160 vd.field_bool("is_for_ruler_selector");
161 }
162}