tiger_lib/ck3/data/
map_environment.rs

1use crate::block::Block;
2use crate::db::{Db, DbKind};
3use crate::everything::Everything;
4use crate::game::GameFlags;
5use crate::item::{Item, ItemLoader, LoadAsFile, Recursive};
6use crate::pdxfile::PdxEncoding;
7use crate::token::Token;
8use crate::validate::validate_camera_color;
9use crate::validator::Validator;
10
11#[derive(Clone, Debug)]
12pub struct MapEnvironment {}
13
14inventory::submit! {
15    ItemLoader::Full(GameFlags::Ck3, Item::MapEnvironment, PdxEncoding::Utf8OptionalBom, ".txt", LoadAsFile::Yes, Recursive::No, MapEnvironment::add)
16}
17
18impl MapEnvironment {
19    pub fn add(db: &mut Db, key: Token, block: Block) {
20        db.add(Item::MapEnvironment, key, block, Box::new(Self {}));
21    }
22}
23
24impl DbKind for MapEnvironment {
25    fn validate(&self, _key: &Token, block: &Block, data: &Everything) {
26        let mut vd = Validator::new(block, data);
27
28        vd.field_precise_numeric("cubemap_intensity");
29        vd.field_item("cubemap", Item::File);
30
31        vd.field_precise_numeric("sun_intensity");
32        vd.field_validated_block("sun_color", validate_camera_color);
33
34        vd.field_list_precise_numeric_exactly("sun_direction", 3);
35        vd.field_list_precise_numeric_exactly("water_sun_direction_offset", 3);
36        vd.field_list_precise_numeric_exactly("shadow_direction_offset", 3);
37        vd.field_precise_numeric("terrain_sunny_sun_azimuth");
38        vd.field_precise_numeric("terrain_sunny_sun_elevation");
39        vd.field_precise_numeric("terrain_overcast_sun_azimuth");
40        vd.field_precise_numeric("terrain_overcast_sun_elevation");
41        vd.field_precise_numeric("map_objects_sunny_sun_azimuth");
42        vd.field_precise_numeric("map_objects_sunny_sun_elevation");
43        vd.field_precise_numeric("map_objects_overcast_sun_azimuth");
44        vd.field_precise_numeric("map_objects_overcast_sun_elevation");
45        vd.field_precise_numeric("water_sunny_sun_azimuth");
46        vd.field_precise_numeric("water_sunny_sun_elevation");
47        vd.field_precise_numeric("water_overcast_sun_azimuth");
48        vd.field_precise_numeric("water_overcast_sun_elevation");
49
50        vd.field_precise_numeric("shadowmap_depthbias");
51        vd.field_precise_numeric("shadowmap_kernelscale");
52        vd.field_precise_numeric("shadowmap_fadefactor");
53
54        vd.field_precise_numeric("map_objects_diffuse_light_scale");
55        vd.field_precise_numeric("map_objects_diffuse_ibl_scale");
56        vd.field_precise_numeric("map_objects_specular_light_scale");
57        vd.field_precise_numeric("map_objects_specular_ibl_scale");
58
59        vd.field_validated_block("fog_color", validate_camera_color);
60        vd.field_precise_numeric("fog_begin");
61        vd.field_precise_numeric("fog_end");
62        vd.field_precise_numeric("fog_max");
63
64        vd.field_validated_block("relative_fog_color", validate_camera_color);
65        vd.field_precise_numeric("relative_fog_begin");
66        vd.field_precise_numeric("relative_fog_end");
67        vd.field_precise_numeric("relative_fog_height_begin");
68        vd.field_precise_numeric("relative_fog_height_end");
69
70        vd.field_precise_numeric("exposure");
71        vd.field_precise_numeric("contrast");
72        vd.field_precise_numeric("pivot");
73
74        vd.field_choice(
75            "tonemap_function",
76            &[
77                "TonyMcMapface",
78                "AgX",
79                "Uchimura",
80                "FilmicACES_Narkowicz",
81                "FilmicACES_Hill",
82                "Uncharted",
83                "Reinhard",
84                "ReinhardModified",
85                "Filmic",
86            ],
87        );
88        if block.get_field_value("tonemap_function").is_some_and(|v| v.is("Uncharted")) {
89            vd.field_validated_block("tonemap_curve", validate_curve);
90        } else {
91            vd.ban_field("tonemap_curve", || "tonemap_function = Uncharted");
92        }
93
94        vd.field_precise_numeric("saturation_scale");
95        vd.field_precise_numeric("value_scale");
96        vd.field_precise_numeric("hue_offset");
97
98        vd.field_list_precise_numeric_exactly("colorbalance", 3);
99        vd.field_validated_block("levels_min", validate_camera_color);
100        vd.field_validated_block("levels_max", validate_camera_color);
101
102        vd.field_precise_numeric("bloom_width");
103        vd.field_precise_numeric("bloom_scale");
104        vd.field_precise_numeric("bright_threshold");
105
106        vd.field_validated_block("depthoffield", validate_dof);
107
108        vd.field_validated_block("fogblur", |block, data| {
109            let mut vd = Validator::new(block, data);
110            vd.field_bool("enabled");
111        });
112
113        // undocumented follow
114
115        vd.field_validated_block("ambient_pos_x", validate_camera_color);
116        vd.field_validated_block("ambient_neg_x", validate_camera_color);
117        vd.field_validated_block("ambient_pos_y", validate_camera_color);
118        vd.field_validated_block("ambient_neg_y", validate_camera_color);
119        vd.field_validated_block("ambient_pos_z", validate_camera_color);
120        vd.field_validated_block("ambient_neg_z", validate_camera_color);
121
122        vd.field_validated_block("shadow_ambient_pos_x", validate_camera_color);
123        vd.field_validated_block("shadow_ambient_neg_x", validate_camera_color);
124        vd.field_validated_block("shadow_ambient_pos_y", validate_camera_color);
125        vd.field_validated_block("shadow_ambient_neg_y", validate_camera_color);
126        vd.field_validated_block("shadow_ambient_pos_z", validate_camera_color);
127        vd.field_validated_block("shadow_ambient_neg_z", validate_camera_color);
128
129        vd.advice_field("cubemap_y_rotation", "removed in 1.18");
130
131        vd.field_precise_numeric("hdr_min_adjustment");
132        vd.field_precise_numeric("hdr_max_adjustment");
133        vd.field_precise_numeric("hdr_adjustment_speed");
134
135        vd.field_precise_numeric("tonemap_middlegrey");
136        vd.field_precise_numeric("tonemap_whiteluminance");
137
138        vd.field_value("exposure_function"); // TODO
139    }
140}
141
142fn validate_curve(block: &Block, data: &Everything) {
143    let mut vd = Validator::new(block, data);
144    vd.field_precise_numeric("shoulder_strength");
145    vd.field_precise_numeric("linear_strength");
146    vd.field_precise_numeric("linear_angle");
147    vd.field_precise_numeric("toe_strength");
148    vd.field_precise_numeric("toe_numerator");
149    vd.field_precise_numeric("toe_denominator");
150    vd.field_precise_numeric("linear_white");
151}
152
153fn validate_dof(block: &Block, data: &Everything) {
154    let mut vd = Validator::new(block, data);
155    vd.field_bool("enabled");
156    vd.field_precise_numeric("dof_samplecount");
157    vd.field_precise_numeric("dof_baseradius");
158    vd.field_precise_numeric("dof_blurblendmin");
159    vd.field_precise_numeric("dof_blurblendmax");
160    vd.field_precise_numeric("dof_blurmin");
161    vd.field_precise_numeric("dof_blurmax");
162    vd.field_precise_numeric("dof_blurscale");
163    vd.field_precise_numeric("dof_blurexponent");
164    vd.field_precise_numeric("dof_heightmin");
165    vd.field_precise_numeric("dof_heightmax");
166}