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("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 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}