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