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::modif::validate_modifs;
8use crate::scopes::Scopes;
9use crate::token::Token;
10use crate::tooltipped::Tooltipped;
11use crate::validator::Validator;
12use crate::vic3::modif::ModifKinds;
13use crate::vic3::tables::modifs::maybe_warn_modifiable_capitalization;
14
15#[derive(Clone, Debug)]
16pub struct LawType {}
17
18inventory::submit! {
19 ItemLoader::Normal(GameFlags::Vic3, Item::LawType, LawType::add)
20}
21
22impl LawType {
23 pub fn add(db: &mut Db, key: Token, block: Block) {
24 db.add(Item::LawType, key, block, Box::new(Self {}));
25 }
26}
27
28impl DbKind for LawType {
29 fn validate(&self, key: &Token, block: &Block, data: &Everything) {
30 fn sc_impose(key: &Token) -> ScopeContext {
31 let mut sc = ScopeContext::new(Scopes::Country, key);
32 sc.define_name("initiator", Scopes::Country, key);
33 sc.define_name("target_country", Scopes::Country, key);
34 sc.define_name("law", Scopes::LawType, key);
35 sc
36 }
37
38 fn sc_impose_chance(key: &Token) -> ScopeContext {
39 let mut sc = ScopeContext::new(Scopes::Country, key);
40 sc.define_name("target_country", Scopes::Country, key);
41 sc.define_name("law", Scopes::LawType, key);
42 sc
43 }
44
45 let mut vd = Validator::new(block, data);
46
47 maybe_warn_modifiable_capitalization(key);
48
49 data.verify_exists(Item::Localization, key);
50 let loca = format!("{key}_desc");
51 data.verify_exists_implied(Item::Localization, &loca, key);
52
53 vd.field_item("group", Item::LawGroup);
54 vd.field_item("parent", Item::LawType);
56 vd.field_item("icon", Item::File);
57
58 vd.field_numeric("progressiveness");
59 vd.field_bool("limited_to_frontier_colonization"); vd.field_validated_block("modifier", |block, data| {
62 let vd = Validator::new(block, data);
63 validate_modifs(block, data, ModifKinds::Country, vd);
64 });
65 vd.field_validated_block("acceptance_modifier", |block, data| {
66 let vd = Validator::new(block, data);
67 validate_modifs(block, data, ModifKinds::Country, vd);
68 });
69
70 vd.field_list_items("requires_law_or", Item::LawType);
71
72 vd.field_trigger_rooted("is_visible", Tooltipped::Yes, Scopes::Country);
73 vd.field_trigger_builder("can_enact", Tooltipped::Yes, |key| {
74 let mut sc = ScopeContext::new(Scopes::Country, key);
75 sc.define_name("law", Scopes::LawType, key);
76 sc
77 });
78 vd.field_effect_rooted("on_enact", Tooltipped::Yes, Scopes::Country);
79 vd.field_effect_rooted("on_activate", Tooltipped::Yes, Scopes::Country);
81 vd.field_effect_rooted("on_deactivate", Tooltipped::Yes, Scopes::Country);
82 vd.field_trigger_builder("religious_acceptance_rule", Tooltipped::No, |key| {
83 let mut sc = ScopeContext::new(Scopes::Religion, key);
84 sc.define_name("country", Scopes::Country, key);
85 sc
86 });
87 vd.field_trigger_builder("cultural_acceptance_rule", Tooltipped::No, |key| {
88 let mut sc = ScopeContext::new(Scopes::Culture, key);
89 sc.define_name("country", Scopes::Country, key);
90 sc
91 });
92
93 vd.multi_field_list_items("possible_political_movements", Item::LawType);
94 vd.multi_field_list_items("unlocking_technologies", Item::Technology);
95 vd.multi_field_list_items("unlocking_laws", Item::LawType);
96 vd.multi_field_list_items("disallowing_laws", Item::LawType);
97 vd.field_script_value_rooted("pop_support", Scopes::Pop);
98
99 vd.field_item("institution", Item::Institution);
100 vd.field_validated_block("institution_modifier", |block, data| {
101 let vd = Validator::new(block, data);
102 validate_modifs(block, data, ModifKinds::Country, vd);
103 });
104
105 vd.multi_field_list_items("build_from_investment_pool", Item::BuildingGroup);
106 vd.field_script_value_rooted("revolution_state_weight", Scopes::State);
107
108 for field in &[
109 "tax_modifier_very_low",
110 "tax_modifier_low",
111 "tax_modifier_medium",
112 "tax_modifier_high",
113 "tax_modifier_very_high",
114 ] {
115 vd.field_validated_block(field, |block, data| {
116 let vd = Validator::new(block, data);
117 validate_modifs(block, data, ModifKinds::Country, vd);
118 });
119 }
120
121 for field in &[
122 "tariff_modifier_no_priority",
123 "tariff_modifier_export_priority",
124 "tariff_modifier_import_priority",
125 ] {
126 vd.advice_field(field, &format!("`{field}` was removed in 1.9"));
127 }
128
129 vd.field_trigger_rooted("ai_will_do", Tooltipped::No, Scopes::Country);
130 vd.field_script_value_no_breakdown_builder("ai_enact_weight_modifier", |key| {
131 let mut sc = ScopeContext::new(Scopes::Country, key);
132 sc.define_name("law", Scopes::Law, key);
133 sc
134 });
135
136 vd.field_trigger_builder("can_impose", Tooltipped::Yes, sc_impose);
137 vd.field_effect_builder("on_impose", Tooltipped::Yes, sc_impose);
138
139 vd.field_script_value_no_breakdown_builder("ai_impose_chance", sc_impose_chance);
140 }
141}
142
143#[derive(Clone, Debug)]
144pub struct LawGroup {}
145
146inventory::submit! {
147 ItemLoader::Normal(GameFlags::Vic3, Item::LawGroup, LawGroup::add)
148}
149
150impl LawGroup {
151 pub fn add(db: &mut Db, key: Token, block: Block) {
152 db.add(Item::LawGroup, key, block, Box::new(Self {}));
153 }
154}
155
156impl DbKind for LawGroup {
157 fn validate(&self, key: &Token, block: &Block, data: &Everything) {
158 let mut vd = Validator::new(block, data);
159
160 maybe_warn_modifiable_capitalization(key);
161
162 data.verify_exists(Item::Localization, key);
163 let loca = format!("{key}_desc");
164 data.verify_exists_implied(Item::Localization, &loca, key);
165
166 vd.field_choice("law_group_category", &["power_structure", "economy", "human_rights"]);
167 vd.field_integer("base_enactment_days");
168 vd.field_numeric("enactment_approval_mult");
169
170 vd.field_numeric("progressive_movement_chance");
171 vd.field_numeric("regressive_movement_chance");
172
173 vd.field_trigger_rooted("change_allowed_trigger", Tooltipped::Yes, Scopes::Country);
174
175 vd.field_bool("affected_by_regime_change");
178 vd.field_item("linked_social_hierarchy", Item::SocialHierarchy);
179 vd.field_numeric("ideological_opinion_impact");
180 }
181}