1 #include <string>
2 #include "environment.h"
3 #include "loadsave.h"
4 #include "../pathes.h"
5 #include "../simversion.h"
6 #include "../simconst.h"
7 #include "../simtypes.h"
8 #include "../simmesg.h"
9 
10 #include "../utils/simrandom.h"
11 void rdwr_win_settings(loadsave_t *file); // simwin
12 
13 sint8 env_t::pak_tile_height_step = 16;
14 sint8 env_t::pak_height_conversion_factor = 1;
15 bool env_t::new_height_map_conversion = false;
16 
17 bool env_t::simple_drawing = false;
18 bool env_t::simple_drawing_fast_forward = true;
19 sint16 env_t::simple_drawing_normal = 4;
20 sint16 env_t::simple_drawing_default = 24;
21 uint8 env_t::follow_convoi_underground = 2;
22 
23 char env_t::program_dir[PATH_MAX];
24 plainstring env_t::default_theme;
25 const char *env_t::user_dir = 0;
26 const char *env_t::savegame_version_str = SAVEGAME_VER_NR;
27 bool env_t::straight_way_without_control = false;
28 bool env_t::networkmode = false;
29 bool env_t::restore_UI = false;
30 extern uint16 network_server_port;
31 uint16 const &env_t::server = network_server_port;
32 
33 uint8 env_t::just_in_time = 1;
34 
35 // Disable announce by default
36 uint32 env_t::server_announce = 0;
37 bool env_t::easy_server = false;
38 // Minimum is every 60 seconds, default is every 15 minutes (900 seconds), maximum is 86400 (1 day)
39 sint32 env_t::server_announce_interval = 900;
40 int env_t::server_port = env_t::server ? env_t::server : 13353;
41 std::string env_t::server_dns;
42 std::string env_t::server_alt_dns; // for dualstack systems
43 std::string env_t::server_name;
44 std::string env_t::server_comments;
45 std::string env_t::server_email;
46 std::string env_t::server_pakurl;
47 std::string env_t::server_infurl;
48 std::string env_t::server_admin_pw;
49 std::string env_t::server_motd_filename;
50 vector_tpl<std::string> env_t::listen;
51 bool env_t::server_save_game_on_quit = false;
52 bool env_t::reload_and_save_on_quit = true;
53 
54 sint32 env_t::server_frames_ahead = 4;
55 sint32 env_t::additional_client_frames_behind = 4;
56 sint32 env_t::network_frames_per_step = 4;
57 uint32 env_t::server_sync_steps_between_checks = 24;
58 bool env_t::pause_server_no_clients = false;
59 
60 std::string env_t::nickname = "";
61 
62 // this is explicitly and interactively set by user => we do not touch it on init
63 const char *env_t::language_iso = "en";
64 sint16 env_t::scroll_multi = -1; // start with same scrool as mouse as nowadays standard
65 sint16 env_t::global_volume = 127;
66 sint16 env_t::midi_volume = 127;
67 bool env_t::mute_sound = false;
68 bool env_t::mute_midi = false;
69 bool env_t::shuffle_midi = true;
70 sint16 env_t::window_snap_distance = 8;
71 scr_size env_t::iconsize( 32, 32 );
72 uint8 env_t::chat_window_transparency = 75;
73 bool env_t::hide_rail_return_ticket = true;
74 bool env_t::show_delete_buttons = false;
75 
76 // only used internally => do not touch further
77 bool env_t::quit_simutrans = false;
78 
79 // default settings for new games
80 settings_t env_t::default_settings;
81 
82 // what finances are shown? (default bank balance)
83 bool env_t::player_finance_display_account = true;
84 
85 // the following initialisation is not important; set values in init()!
86 std::string env_t::objfilename;
87 bool env_t::night_shift;
88 bool env_t::hide_with_transparency;
89 bool env_t::hide_trees;
90 uint8 env_t::hide_buildings;
91 bool env_t::hide_under_cursor;
92 uint16 env_t::cursor_hide_range;
93 bool env_t::use_transparency_station_coverage;
94 uint8 env_t::station_coverage_show;
95 sint32 env_t::show_names;
96 sint32 env_t::message_flags[4];
97 uint32 env_t::water_animation;
98 uint32 env_t::ground_object_probability;
99 uint32 env_t::moving_object_probability;
100 bool env_t::road_user_info;
101 bool env_t::tree_info;
102 bool env_t::ground_info;
103 bool env_t::townhall_info;
104 bool env_t::single_info;
105 bool env_t::window_buttons_right;
106 bool env_t::second_open_closes_win;
107 bool env_t::remember_window_positions;
108 bool env_t::window_frame_active;
109 uint8 env_t::verbose_debug;
110 uint8 env_t::default_sortmode;
111 uint32 env_t::default_mapmode;
112 uint8 env_t::show_month;
113 sint32 env_t::intercity_road_length;
114 plainstring env_t::river_type[10];
115 uint8 env_t::river_types;
116 sint32 env_t::autosave;
117 uint32 env_t::fps;
118 sint16 env_t::max_acceleration;
119 uint8 env_t::num_threads;
120 bool env_t::show_tooltips;
121 uint32 env_t::tooltip_color_rgb;
122 PIXVAL env_t::tooltip_color;
123 uint32 env_t::tooltip_textcolor_rgb;
124 PIXVAL env_t::tooltip_textcolor;
125 uint8 env_t::toolbar_max_width;
126 uint8 env_t::toolbar_max_height;
127 uint32 env_t::cursor_overlay_color_rgb;
128 PIXVAL env_t::cursor_overlay_color;
129 uint32 env_t::background_color_rgb;
130 PIXVAL env_t::background_color;
131 bool env_t::draw_earth_border;
132 bool env_t::draw_outside_tile;
133 uint8 env_t::show_vehicle_states;
134 bool env_t::visualize_schedule;
135 sint8 env_t::daynight_level;
136 bool env_t::left_to_right_graphs;
137 uint32 env_t::tooltip_delay;
138 uint32 env_t::tooltip_duration;
139 sint8 env_t::show_money_message;
140 
141 std::string env_t::fontname = FONT_PATH_X "prop.fnt";
142 uint8 env_t::fontsize = 11;
143 
144 uint32 env_t::front_window_text_color_rgb;
145 PIXVAL env_t::front_window_text_color;
146 uint32 env_t::bottom_window_text_color_rgb;
147 PIXVAL env_t::bottom_window_text_color;
148 uint32 env_t::default_window_title_color_rgb;
149 PIXVAL env_t::default_window_title_color;
150 uint8 env_t::bottom_window_darkness;
151 
152 uint16 env_t::compass_map_position;
153 uint16 env_t::compass_screen_position;
154 
155 uint32 env_t::default_ai_construction_speed;
156 
157 bool env_t::hide_keyboard = false;
158 
159 
160 
161 // Hajo: Define default settings.
init()162 void env_t::init()
163 {
164 	// settings for messages
165 	message_flags[0] = 0x017F;
166 	message_flags[1] = 0x0108;
167 	message_flags[2] = 0x0080;
168 	message_flags[3] = 0;
169 
170 	night_shift = false;
171 
172 	hide_with_transparency = true;
173 	hide_trees = false;
174 	hide_buildings = env_t::NOT_HIDE;
175 	hide_under_cursor = false;
176 	cursor_hide_range = 5;
177 
178 	visualize_schedule = true;
179 
180 	/* station stuff */
181 	use_transparency_station_coverage = true;
182 	station_coverage_show = 0;
183 
184 	show_names = 3;
185 	player_finance_display_account = true;
186 
187 	water_animation = 250; // 250ms per wave stage
188 	ground_object_probability = 10; // every n-th tile
189 	moving_object_probability = 1000; // every n-th tile
190 
191 	follow_convoi_underground = 2;  // slice through map
192 
193 	road_user_info = false;
194 	tree_info = true;
195 	ground_info = false;
196 	townhall_info = false;
197 	single_info = true;
198 
199 	window_buttons_right = false;
200 	window_frame_active = false;
201 	second_open_closes_win = false;
202 	remember_window_positions = true;
203 
204 	// debug level (0: only fatal, 1: error, 2: warning, 3: all
205 	verbose_debug = 0;
206 
207 	default_sortmode = 1;	// sort by amount
208 	default_mapmode = 0;	// show cities
209 
210 	savegame_version_str = SAVEGAME_VER_NR;
211 
212 	show_month = DATE_FMT_US;
213 
214 	intercity_road_length = 200;
215 
216 	river_types = 0;
217 
218 
219 	/* prissi: autosave every x months (0=off) */
220 	autosave = 0;
221 
222 	// default: make 25 frames per second (if possible)
223 	fps=25;
224 
225 	// maximum speedup set to 1000 (effectively no limit)
226 	max_acceleration=50;
227 
228 #ifdef MULTI_THREAD
229 	num_threads = 4;
230 #else
231 	num_threads = 1;
232 #endif
233 
234 	show_tooltips = true;
235 	tooltip_color_rgb = 0x3964D0; // COL_SOFT_BLUE
236 	tooltip_textcolor_rgb = 0x000000; // COL_BLACK
237 
238 	toolbar_max_width = 0;
239 	toolbar_max_height = 0;
240 
241 	cursor_overlay_color_rgb = 0xFF8000; // COL_ORANGE
242 
243 	background_color_rgb = 0x404040; // COL_GREY2
244 	draw_earth_border = true;
245 	draw_outside_tile = false;
246 
247 	show_vehicle_states = 1;
248 
249 	daynight_level = 0;
250 
251 	// midi/sound option
252 	global_volume = 127;
253 	midi_volume = 127;
254 	mute_sound = false;
255 	mute_midi = false;
256 	shuffle_midi = true;
257 
258 	left_to_right_graphs = false;
259 
260 	tooltip_delay = 500;
261 	tooltip_duration = 5000;
262 
263 	front_window_text_color_rgb = 0xFFFFFF; // COL_WHITE
264 	bottom_window_text_color_rgb = 0xDDDDDD;
265 	default_window_title_color_rgb = 0xD76B00;
266 	bottom_window_darkness = 25;
267 
268 	default_ai_construction_speed = 8000;
269 
270 	// upper right
271 	compass_map_position = ALIGN_RIGHT|ALIGN_TOP;
272 	// lower right
273 	compass_screen_position = 0, // disbale, other could be ALIGN_RIGHT|ALIGN_BOTTOM;
274 
275 	// Listen on all addresses by default
276 	listen.append_unique("::");
277 	listen.append_unique("0.0.0.0");
278 	show_money_message = 0;
279 }
280 
281 
282 // save/restore environment
rdwr(loadsave_t * file)283 void env_t::rdwr(loadsave_t *file)
284 {
285 	// env_t used to be called umgebung_t - keep old name when saving and loading for compatibility
286 	xml_tag_t u( file, "umgebung_t" );
287 
288 	file->rdwr_short( scroll_multi );
289 	file->rdwr_bool( night_shift );
290 	file->rdwr_byte( daynight_level );
291 	file->rdwr_long( water_animation );
292 	if(  file->is_version_less(110, 7)  ) {
293 		bool dummy_b = 0;
294 		file->rdwr_bool( dummy_b );
295 	}
296 	file->rdwr_byte( show_month );
297 
298 	file->rdwr_bool( use_transparency_station_coverage );
299 	file->rdwr_byte( station_coverage_show );
300 	file->rdwr_long( show_names );
301 
302 	file->rdwr_bool( hide_with_transparency );
303 	file->rdwr_byte( hide_buildings );
304 	file->rdwr_bool( hide_trees );
305 
306 	file->rdwr_long( message_flags[0] );
307 	file->rdwr_long( message_flags[1] );
308 	file->rdwr_long( message_flags[2] );
309 	file->rdwr_long( message_flags[3] );
310 
311 	if (  file->is_loading()  ) {
312 		if(  file->is_version_less(110, 0)  ) {
313 			// did not know about chat message, so we enable it
314 			message_flags[0] |=  (1 << message_t::chat); // ticker
315 			message_flags[1] &= ~(1 << message_t::chat); // permanent window off
316 			message_flags[2] &= ~(1 << message_t::chat); // timed window off
317 			message_flags[3] &= ~(1 << message_t::chat); // do not ignore completely
318 		}
319 		if(  file->is_version_less(112, 3)  ) {
320 			// did not know about scenario message, so we enable it
321 			message_flags[0] &= ~(1 << message_t::scenario); // ticker off
322 			message_flags[1] |=  (1 << message_t::scenario); // permanent window on
323 			message_flags[2] &= ~(1 << message_t::scenario); // timed window off
324 			message_flags[3] &= ~(1 << message_t::scenario); // do not ignore completely
325 		}
326 	}
327 
328 	file->rdwr_bool( show_tooltips );
329 	if (  file->is_version_less(120, 5)  ) {
330 		uint8 color = COL_SOFT_BLUE;
331 		file->rdwr_byte( color );
332 		env_t::tooltip_color_rgb = get_color_rgb(color);
333 
334 		color = COL_BLACK;
335 		file->rdwr_byte( color );
336 		env_t::tooltip_textcolor_rgb = get_color_rgb(color);
337 	}
338 
339 	file->rdwr_long( autosave );
340 	file->rdwr_long( fps );
341 	file->rdwr_short( max_acceleration );
342 
343 	file->rdwr_bool( road_user_info );
344 	file->rdwr_bool( tree_info );
345 	file->rdwr_bool( ground_info );
346 	file->rdwr_bool( townhall_info );
347 	file->rdwr_bool( single_info );
348 
349 	file->rdwr_byte( default_sortmode );
350 	if(  file->is_version_less(111, 4)  ) {
351 		sint8 mode = log2(env_t::default_mapmode)-1;
352 		file->rdwr_byte( mode );
353 		env_t::default_mapmode = mode>=0 ? 1 << mode : 0;
354 	}
355 	else {
356 		file->rdwr_long( env_t::default_mapmode );
357 	}
358 
359 	file->rdwr_bool( window_buttons_right );
360 	file->rdwr_bool( window_frame_active );
361 
362 	if(  file->is_version_less(112, 1)  ) {
363 		// set by command-line, it does not make sense to save it.
364 		uint8 v = verbose_debug;
365 		file->rdwr_byte( v );
366 	}
367 
368 	file->rdwr_long( intercity_road_length );
369 	if(  file->is_version_less(102, 3)  ) {
370 		bool no_tree = false;
371 		file->rdwr_bool( no_tree );
372 	}
373 	file->rdwr_long( ground_object_probability );
374 	file->rdwr_long( moving_object_probability );
375 
376 	if(  file->is_loading()  ) {
377 		// these three bytes will be lost ...
378 		const char *c = NULL;
379 		file->rdwr_str( c );
380 		language_iso = c;
381 	}
382 	else {
383 		file->rdwr_str( language_iso );
384 	}
385 
386 	file->rdwr_short( global_volume );
387 	file->rdwr_short( midi_volume );
388 	file->rdwr_bool( mute_sound );
389 	file->rdwr_bool( mute_midi );
390 	file->rdwr_bool( shuffle_midi );
391 
392 	if(  file->is_version_atleast(102, 2)  ) {
393 		file->rdwr_byte( show_vehicle_states );
394 		file->rdwr_bool( left_to_right_graphs );
395 	}
396 
397 	if(  file->is_version_atleast(102, 3)  ) {
398 		file->rdwr_long( tooltip_delay );
399 		file->rdwr_long( tooltip_duration );
400 		if (  file->is_version_less(120, 5)  ) {
401 			uint8 color = COL_WHITE;
402 			file->rdwr_byte( color ); // to skip old parameter front_window_bar_color
403 
404 			file->rdwr_byte( color );
405 			env_t::front_window_text_color_rgb = get_color_rgb(color);
406 
407 			file->rdwr_byte( color ); // to skip old parameter bottom_window_bar_color
408 
409 			color = 209; // CITY_KI
410 			file->rdwr_byte( color );
411 			env_t::bottom_window_text_color_rgb = get_color_rgb(color);
412 		}
413 	}
414 
415 	if(  file->is_version_atleast(110, 0)  ) {
416 		bool dummy = false;
417 		file->rdwr_bool(dummy); //was add_player_name_to_message
418 		file->rdwr_short( window_snap_distance );
419 	}
420 
421 	if(  file->is_version_atleast(111, 1)  ) {
422 		file->rdwr_bool( hide_under_cursor );
423 		file->rdwr_short( cursor_hide_range );
424 	}
425 
426 	if(  file->is_version_atleast(111, 2)  ) {
427 		file->rdwr_bool( visualize_schedule );
428 	}
429 	if(  file->is_version_atleast(111, 3)  ) {
430 		plainstring str = nickname.c_str();
431 		file->rdwr_str(str);
432 		if (file->is_loading()) {
433 			nickname = str ? str.c_str() : "";
434 		}
435 	}
436 	if(  file->is_version_atleast(112, 6)  ) {
437 		if(  file->is_version_less(120, 5)  ) {
438 			uint8 color = COL_GREY2;
439 			file->rdwr_byte( color );
440 			env_t::background_color_rgb = get_color_rgb(color);
441 		}
442 		file->rdwr_bool( draw_earth_border );
443 		file->rdwr_bool( draw_outside_tile );
444 	}
445 	if(  file->is_version_atleast(112, 7)  ) {
446 		file->rdwr_bool( second_open_closes_win );
447 		file->rdwr_bool( remember_window_positions );
448 	}
449 	if(  file->is_version_atleast(112, 8)  ) {
450 		file->rdwr_bool( show_delete_buttons );
451 	}
452 	if(  file->is_version_atleast(120, 1)  ) {
453 		file->rdwr_str( default_theme );
454 	}
455 	if(  file->is_version_atleast(120, 2)  ) {
456 		file->rdwr_bool( new_height_map_conversion );
457 	}
458 	if(  file->is_version_atleast(120, 5)  ) {
459 		file->rdwr_long( background_color_rgb );
460 		file->rdwr_long( tooltip_color_rgb );
461 		file->rdwr_long( tooltip_textcolor_rgb );
462 		file->rdwr_long( default_window_title_color_rgb );
463 		file->rdwr_long( front_window_text_color_rgb );
464 		file->rdwr_long( bottom_window_text_color_rgb );
465 		file->rdwr_byte( bottom_window_darkness );
466 	}
467 	if(  file->is_version_atleast(120, 6)  ) {
468 		plainstring str = fontname.c_str();
469 		file->rdwr_str( str );
470 		if (file->is_loading()) {
471 			fontname = str ? str.c_str() : "";
472 		}
473 		file->rdwr_byte( fontsize );
474 	}
475 	if(  file->is_version_atleast(102, 7)  ) {
476 		file->rdwr_byte(show_money_message);
477 	}
478 
479 	if (file->is_version_atleast(120, 8)) {
480 		rdwr_win_settings(file);
481 	}
482 
483 	if (file->is_version_atleast(120, 9)) {
484 		file->rdwr_byte(follow_convoi_underground);
485 	}
486 	// server settings are not saved, since they are server specific
487 	// and could be different on different servers on the same computers
488 }
489