1 /*
2 GL-117
3 Copyright 2001, 2002 Thomas A. Drexl aka heptargon
4
5 This file is part of GL-117.
6
7 GL-117 is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GL-117 is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GL-117; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 /* This file contains all configuration parsing code. */
23
24 #ifndef IS_CONF_H
25
26 #include <stdio.h>
27 #include <string.h>
28 #include <stdlib.h>
29 #include <ctype.h>
30
31 #include "conf.h"
32 #include "common.h"
33 #include "dirs.h"
34
35 // initialization
36 int quality = 3;
37 float view = 50.0;
38 int width = 800, height = 600, bpp = 32;
39 int wantwidth = 800, wantheight = 600, wantfullscreen = 1;
40 int dithering = 1;
41 int volumesound = 100;
42 int volumemusic = 100;
43 int fullscreen = 1;
44 int controls = CONTROLS_MOUSE;
45 int difficulty = 1;
46 int physics = 0;
47 int antialiasing = 1;
48 int specialeffects = 1;
49 int dynamiclighting = 1;
50
51 // use 0...255 for one byte keys, 256... for special (two byte) beys
52 unsigned int key_firecannon = 32, key_firemissile = 13, key_dropchaff = 'C', key_dropflare = 'F';
53 unsigned int key_selectmissile = 'M', key_thrustup = 'S', key_thrustdown = 'X';
54 unsigned int key_targetnearest = 'E', key_targetnext = 'T', key_targetprevious = 'P', key_targetlocking = 'L';
55
56 int joystick_firecannon = 0, joystick_firemissile = 2, joystick_dropchaff = 3, joystick_dropflare = 3;
57 int joystick_selectmissile = 1, joystick_thrustup = 4, joystick_thrustdown = 5;
58 int joystick_targetnearest = 101, joystick_targetnext = 100, joystick_targetprevious = 102, joystick_targetlocking = 103;
59 int joystick_aileron = 0, joystick_elevator = 1, joystick_rudder = 3, joystick_throttle = 2;
60 int joystick_view_x = 4, joystick_view_y = 5;
61
62 unsigned char mouse_firecannon = MOUSE_BUTTON_LEFT, mouse_firemissile = MOUSE_BUTTON_RIGHT;
63 unsigned char mouse_selectmissile = MOUSE_BUTTON_MIDDLE;
64 unsigned int mouse_sensitivity = 100;
65 bool mouse_reverse = false;
66 bool mouse_relative = false;
67 int mouse_autorudder = 30;
68
ConfigFile()69 ConfigFile::ConfigFile () {}
70
ConfigFile(char * fname)71 ConfigFile::ConfigFile (char *fname)
72 {
73 char buf2 [STDSIZE];
74 bool commentmode = false;
75 FILE *in;
76 length = 0;
77 in = fopen (fname, "rb");
78 if (in != NULL)
79 {
80 length = fread (buf, 1, 32000, in);
81 fclose (in);
82 }
83 else
84 {
85 sprintf (buf2, "Could not load %s", fname);
86 display (buf2, LOG_WARN);
87 buf [0] = 0;
88 }
89 for (int i = 0; i < length; i ++)
90 {
91 if (buf [i] == '#') commentmode = true;
92 if (buf [i] == '\n') commentmode = false;
93 if (commentmode) buf [i] = ' ';
94 else buf [i] = tolower (buf [i]);
95 }
96 }
97
skipwhite(char * str)98 char *ConfigFile::skipwhite (char *str)
99 {
100 while (*str == ' ' || *str == '\t')
101 str ++;
102 return str;
103 }
104
skipnum(char * str)105 char *ConfigFile::skipnum (char *str)
106 {
107 while (*str >= '0' && *str <= '9')
108 str ++;
109 return str;
110 }
111
skipalphanum(char * str)112 char *ConfigFile::skipalphanum (char *str)
113 {
114 while (*str >= '0' && *str <= 'z')
115 str ++;
116 return str;
117 }
118
getString(char * dest,char * str)119 char *ConfigFile::getString (char *dest, char *str)
120 {
121 char *strf, *stre;
122 char cmpstr [256];
123 int i;
124 if (strlen (str) >= 256) { return NULL; }
125 strcpy (cmpstr, str);
126 if (buf [0] == 0) { return NULL; }
127 for (i = 0; i < (int) strlen (cmpstr); i ++)
128 {
129 cmpstr [i] = tolower (cmpstr [i]);
130 }
131 strf = strstr (buf, cmpstr);
132 if (strf == NULL) { return NULL; }
133 strf += strlen (cmpstr);
134 strf = skipwhite (strf);
135 if (*strf == 0) { return NULL; }
136 strf ++;
137 if (*strf == 0) { return NULL; }
138 strf = skipwhite (strf);
139 if (*strf == 0) { return NULL; }
140 stre = skipalphanum (strf);
141 if (stre - strf >= 256) { return NULL; }
142 if (*strf == 0) { return NULL; }
143 for (i = 0; i < (int) (stre - strf); i ++)
144 dest [i] = *(strf+i);
145 dest [i] = 0;
146 return dest;
147 }
148
getValue(char * str)149 int ConfigFile::getValue (char *str)
150 {
151 char res [256];
152 getString (res, str);
153 if (res == NULL) return -1;
154 return atoi (res);
155 }
156
openOutput(char * fname)157 int ConfigFile::openOutput (char *fname)
158 {
159 out = fopen (fname, "wb");
160 if (out == NULL) return 0;
161 return 1;
162 }
163
write(char * str1,int n)164 int ConfigFile::write (char *str1, int n)
165 {
166 char str [256];
167 if (strlen (str1) + 8 > 256) return 0;
168 sprintf (str, "%s = %d\n", str1, n);
169 fwrite (str, 1, strlen (str), out);
170 return 1;
171 }
172
write(char * str1,char c)173 int ConfigFile::write (char *str1, char c)
174 {
175 char str [256];
176 if (c <= 32 || c >= 97)
177 {
178 write (str1, (int) c);
179 return 1;
180 }
181 if (strlen (str1) + 8 > 256) return 0;
182 sprintf (str, "%s = %c\n", str1, c);
183 fwrite (str, 1, strlen (str), out);
184 return 1;
185 }
186
writeText(char * str)187 void ConfigFile::writeText (char *str)
188 {
189 fwrite (str, 1, strlen (str), out);
190 fwrite ("\n", 1, 1, out);
191 }
192
close()193 void ConfigFile::close ()
194 {
195 fclose (out);
196 }
197
198
199
save_config()200 void save_config ()
201 {
202 char buf [STDSIZE];
203 ConfigFile *cf = new ConfigFile ();
204 char *confname = dirs->getSaves ("conf");
205 sprintf (buf, "Saving %s ", confname);
206 display (buf, LOG_MOST);
207 int ret1 = cf->openOutput (confname);
208 if (ret1 == 0)
209 {
210 display ("Could not save configuration", LOG_ERROR);
211 fflush (stderr);
212 return;
213 }
214 cf->writeText ("# Configuration\n");
215 cf->writeText ("# Some possible width x height values for fullscreen mode:");
216 cf->writeText ("# 640x480, 800x600, 1024x768, 1152x864, 1280x768, 1280x960, 1280x1024");
217 cf->write (" width", wantwidth);
218 cf->write (" height", wantheight);
219 cf->writeText ("# Possible bits per pixel values (color depth):");
220 cf->writeText ("# 8 (not recommended), 16, 24, 32");
221 cf->write (" bpp", bpp);
222 cf->writeText ("# Try to go fullscreen = 1, game in window = 0");
223 cf->write (" fullscreen", wantfullscreen);
224 cf->writeText ("# Quality: 0=software rendered up to 5=best (default=2)");
225 cf->write (" quality", quality);
226 cf->writeText ("# Far clipping plane: 20..100 (default=50)");
227 cf->write (" view", (int) view);
228 cf->writeText ("# Dithering: 0=off, 1=on (default=1)");
229 cf->write (" dithering", dithering);
230 cf->writeText ("# Antialiasing: 0=off, 1=on (default=1)");
231 cf->write (" antialiasing", antialiasing);
232 cf->writeText ("# Special effects: 0=off, 1=on (default=1)");
233 cf->write (" specialeffects", specialeffects);
234 cf->writeText ("# Dynamic lighting: 0=off, 1=on (default=1)");
235 cf->write (" dynamiclighting", dynamiclighting);
236 #ifdef HAVE_SDL_MIXER
237 cf->writeText ("# Sound volume: 0..100 (default=100) per cent");
238 cf->write (" sound", (int) volumesound);
239 cf->writeText ("# Music volume: 0..100 (default=100) per cent");
240 cf->write (" music", (int) volumemusic);
241 #endif
242 cf->writeText ("# Piloting controls: 0=keyboard, 1=mouse easy, 2=joystick");
243 cf->write (" controls", controls);
244 cf->writeText ("# Difficulty level: 0=easy, 1=medium, 2=hard");
245 cf->write (" difficulty", difficulty);
246 cf->writeText ("# Brightness: -50..50 per cent (default=0)");
247 cf->write (" brightness", brightness);
248 cf->writeText ("# Physics: 0=action, 1=realistic");
249 cf->write (" physics", physics);
250 cf->writeText ("\n# This file is meant to give sensible startup settings");
251 cf->writeText ("# as graphic cards and drivers may differ some 100 times in speed");
252 cf->writeText ("\n# To get back to default settings, just delete this file!");
253 cf->close ();
254 delete cf;
255 }
256
save_saveconfig()257 void save_saveconfig ()
258 {
259 char buf [STDSIZE];
260 ConfigFile *cf = new ConfigFile ();
261 char *confname = dirs->getSaves ("saveconf");
262 sprintf (buf, "Saving %s ", confname);
263 display (buf, LOG_MOST);
264 int ret1 = cf->openOutput (confname);
265 if (ret1 == 0)
266 {
267 display ("Could not save working graphics mode configuration", LOG_ERROR);
268 fflush (stderr);
269 return;
270 }
271 cf->writeText ("# Working backup configuration\n");
272 cf->writeText ("# Do not edit this file. It is only used to restore a broken configuration!");
273 cf->write (" width", width);
274 cf->write (" height", height);
275 cf->write (" bpp", bpp);
276 cf->write (" fullscreen", fullscreen);
277 cf->close ();
278 delete cf;
279 }
280
load_config()281 int load_config ()
282 {
283 char buf [STDSIZE];
284 char ret [256];
285 char *str;
286 char *confname = dirs->getSaves ("conf");
287 sprintf (buf, "Loading %s ", confname);
288 display (buf, LOG_MOST);
289 ConfigFile *cf = new ConfigFile (confname);
290
291 if (cf->buf [0] == 0) // no file found
292 {
293 delete cf;
294 return 0;
295 }
296
297 str = cf->getString (ret, "width");
298 if (str == NULL)
299 { width = 800; }
300 else
301 { width = atoi (str); }
302 if (width < 100) width = 100;
303 else if (width > 3000) width = 1024;
304 wantwidth = width;
305
306 str = cf->getString (ret, "height");
307 if (str == NULL)
308 { height = 600; }
309 else
310 { height = atoi (str); }
311 if (height < 100) height = 100;
312 else if (height > 2000) height = 768;
313 wantheight = height;
314
315 str = cf->getString (ret, "bpp");
316 if (str == NULL)
317 { bpp = 32; }
318 else
319 { bpp = atoi (str); }
320 if (bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32)
321 bpp = 32;
322
323 str = cf->getString (ret, "fullscreen");
324 if (str == NULL)
325 { fullscreen = 1; }
326 else
327 { fullscreen = atoi (str); }
328 if (fullscreen) fullscreen = 1;
329 wantfullscreen = fullscreen;
330
331 str = cf->getString (ret, "quality");
332 if (str == NULL)
333 { quality = 2; }
334 else
335 { quality = atoi (str); }
336 if (quality < 0) quality = 0;
337 else if (quality > 5) quality = 5;
338
339 str = cf->getString (ret, "view");
340 if (str == NULL)
341 { view = 50; }
342 else
343 { view = atoi (str); }
344 if (view < VIEW_MIN)
345 {
346 view = VIEW_MIN;
347 }
348 else if (view > VIEW_MAX)
349 {
350 view = VIEW_MAX;
351 }
352
353 str = cf->getString (ret, "dithering");
354 dithering = (str == NULL) ? 1 : atoi (str);
355 if (dithering) dithering = 1;
356
357 str = cf->getString (ret, "antialiasing");
358 antialiasing = (str == NULL) ? 1 : atoi (str);
359 if (antialiasing) antialiasing = 1;
360
361 str = cf->getString (ret, "specialeffects");
362 specialeffects = (str == NULL) ? 1 : atoi (str);
363 if (specialeffects) specialeffects = 1;
364
365 str = cf->getString (ret, "dynamiclighting");
366 dynamiclighting = (str == NULL) ? 1 : atoi (str);
367 if (dynamiclighting) dynamiclighting = 1;
368
369 #ifdef HAVE_SDL_MIXER
370 str = cf->getString (ret, "sound");
371 if (str == NULL)
372 { volumesound = 100; }
373 else
374 { volumesound = atoi (str); }
375 if (volumesound < 0) volumesound = 0;
376 else if (volumesound > 100) volumesound = 100;
377
378 str = cf->getString (ret, "music");
379 if (str == NULL)
380 { volumemusic = 100; }
381 else
382 { volumemusic = atoi (str); }
383 if (volumemusic < 0) volumemusic = 0;
384 else if (volumemusic > 100) volumemusic = 100;
385 #endif
386
387 str = cf->getString (ret, "controls");
388 if (str == NULL)
389 { controls = CONTROLS_MOUSE; }
390 else
391 { controls = atoi (str); }
392 if (controls < 0) controls = 0;
393 else if (controls > 2) controls = 0;
394
395 str = cf->getString (ret, "difficulty");
396 if (str == NULL)
397 { difficulty = 1; }
398 else
399 { difficulty = atoi (str); }
400 if (difficulty < 0) difficulty = 0;
401 else if (difficulty > 2) difficulty = 0;
402
403 str = cf->getString (ret, "brightness");
404 if (str == NULL)
405 { brightness = 0; }
406 else
407 { brightness = atoi (str); }
408 if (brightness < -50) brightness = -50;
409 else if (brightness > 50) brightness = 50;
410
411 str = cf->getString (ret, "physics");
412 if (str == NULL)
413 { physics = 0; }
414 else
415 { physics = atoi (str); }
416 if (physics < 0) physics = 0;
417 else if (physics > 1) physics = 1;
418
419 delete cf;
420 return 1;
421 }
422
load_saveconfig()423 int load_saveconfig ()
424 {
425 char buf [STDSIZE];
426 char ret [256];
427 char *str;
428 char *confname = dirs->getSaves ("saveconf");
429 sprintf (buf, "Loading %s ", confname);
430 display (buf, LOG_MOST);
431 ConfigFile *cf = new ConfigFile (confname);
432
433 if (cf->buf [0] == 0) // no file found
434 {
435 delete cf;
436 return 0;
437 }
438
439 str = cf->getString (ret, "savewidth");
440 if (str == NULL)
441 { width = 800; }
442 else
443 { width = atoi (str); }
444 if (width < 100) width = 100;
445 else if (width > 3000) width = 1024;
446
447 str = cf->getString (ret, "saveheight");
448 if (str == NULL)
449 { height = 600; }
450 else
451 { height = atoi (str); }
452 if (height < 100) height = 100;
453 else if (height > 2000) height = 768;
454
455 str = cf->getString (ret, "savebpp");
456 if (str == NULL)
457 { bpp = 32; }
458 else
459 { bpp = atoi (str); }
460 if (bpp != 8 && bpp != 16 && bpp != 24 && bpp != 32)
461 bpp = 32;
462
463 str = cf->getString (ret, "savefullscreen");
464 if (str == NULL)
465 { fullscreen = 1; }
466 else
467 { fullscreen = atoi (str); }
468 if (fullscreen) fullscreen = 1;
469
470 delete cf;
471 return 1;
472 }
473
writeJoystick(ConfigFile * cf,char * str,int jn)474 void writeJoystick (ConfigFile *cf, char *str, int jn)
475 {
476 char buf [STDSIZE];
477 sprintf (buf, "%s = %c%d", str, 'A' + (jn / 1000), jn % 1000);
478 cf->writeText (buf);
479 }
480
save_configInterface()481 void save_configInterface ()
482 {
483 char buf [STDSIZE];
484 ConfigFile *cf = new ConfigFile ();
485 char *confname = dirs->getSaves ("conf.interface");
486 sprintf (buf, "Saving %s ", confname);
487 display (buf, LOG_MOST);
488 int ret1 = cf->openOutput (confname);
489 if (ret1 == 0)
490 {
491 display ("Could not save interface configuration", LOG_ERROR);
492 return;
493 }
494 cf->writeText ("# Interface configuration\n");
495 cf->writeText ("# ---------------------------------------------------------------------");
496 cf->writeText ("# Keyboard section");
497 cf->writeText ("# ---------------------------------------------------------------------\n");
498 cf->writeText ("# Use ASCII-Code values or letters to remap");
499 cf->writeText ("# 8=BACKSPACE, 13=ENTER, 32=SPACE, 65=A...90=Z (NOT case sensitive)");
500 cf->write (" key_firecannon", (int) key_firecannon);
501 cf->write (" key_firemissile", (int) key_firemissile);
502 cf->write (" key_dropflare", (int) key_dropflare);
503 cf->write (" key_dropchaff", (int) key_dropchaff);
504 cf->write (" key_selectmissile", (int) key_selectmissile);
505 cf->writeText ("# Target nearest enemy with priority for enemies in front of you");
506 cf->write (" key_targetnearest", (int) key_targetnearest);
507 cf->writeText ("# Target next enemy who has locked you");
508 cf->write (" key_targetlocking", (int) key_targetlocking);
509 cf->write (" key_targetnext", (int) key_targetnext);
510 cf->write (" key_targetprevious", (int) key_targetprevious);
511 cf->write (" key_incthrust", (int) key_thrustup);
512 cf->write (" key_decthrust", (int) key_thrustdown);
513 cf->writeText ("# All other piloting keys (CURSORS, PGUP/DN) are fixed.");
514 cf->writeText ("\n# ---------------------------------------------------------------------");
515 cf->writeText ("# Mouse section");
516 cf->writeText ("# ---------------------------------------------------------------------\n");
517 cf->writeText ("# Sensitivity: 70...200%, 70%=full screen area, 200%=max sensitivity");
518 cf->write (" mouse_sensitivity", (int) mouse_sensitivity);
519 cf->writeText ("# Reverse y-axis: 0 (no) or 1 (yes)");
520 cf->write (" mouse_reverse", (int) mouse_reverse);
521 cf->writeText ("# Relative coordinates: 0 (no) or 1 (yes)");
522 cf->write (" mouse_relative", (int) mouse_relative);
523 cf->writeText ("# Auto rudder on x-axis, dead area for rolls: 0...100");
524 cf->write (" mouse_autorudder", (int) mouse_autorudder);
525 cf->writeText ("\n# Buttons: 1=Left, 2=Middle, 3=Right");
526 int mousebutton = 1;
527 if (mouse_firecannon == MOUSE_BUTTON_MIDDLE) mousebutton = 2;
528 else if (mouse_firecannon == MOUSE_BUTTON_RIGHT) mousebutton = 3;
529 else mousebutton = 1;
530 cf->write (" mouse_firecannon", mousebutton);
531 if (mouse_firemissile == MOUSE_BUTTON_MIDDLE) mousebutton = 2;
532 else if (mouse_firemissile == MOUSE_BUTTON_RIGHT) mousebutton = 3;
533 else mousebutton = 1;
534 cf->write (" mouse_firemissile", mousebutton);
535 if (mouse_selectmissile == MOUSE_BUTTON_MIDDLE) mousebutton = 2;
536 else if (mouse_selectmissile == MOUSE_BUTTON_RIGHT) mousebutton = 3;
537 else mousebutton = 1;
538 cf->write (" mouse_selectmissile", mousebutton);
539 cf->writeText ("\n# ---------------------------------------------------------------------");
540 cf->writeText ("# Joystick section");
541 cf->writeText ("# ---------------------------------------------------------------------\n");
542 cf->writeText ("# The number of axes, buttons, and the coolie hat depends on your joystick!");
543 cf->writeText ("# Numbers start with A=first joystick, B=second joystick...J=10th joystick");
544 cf->writeText ("# followed by a number to identify axes, buttons, and coolie hat\n");
545 cf->writeText ("# Axis: 0...MAX-1 (maybe 0=aileron 1=elevator 2=throttle 3=rudder)");
546 writeJoystick (cf, " joystick_aileron", joystick_aileron);
547 writeJoystick (cf, " joystick_elevator", joystick_elevator);
548 writeJoystick (cf, " joystick_throttle", joystick_throttle);
549 writeJoystick (cf, " joystick_rudder", joystick_rudder);
550 writeJoystick (cf, " joystick_view_x", joystick_view_x);
551 writeJoystick (cf, " joystick_view_y", joystick_view_y);
552 cf->writeText ("\n# Buttons: 0...MAX-1, Coolie: 100=Right, 101=Up, 102=Left, 103=Down");
553 writeJoystick (cf, " joystick_firecannon", joystick_firecannon);
554 writeJoystick (cf, " joystick_firemissile", joystick_firemissile);
555 cf->writeText ("# Dropping chaff AND flare may be preferred");
556 writeJoystick (cf, " joystick_dropflare", joystick_dropflare);
557 writeJoystick (cf, " joystick_dropchaff", joystick_dropchaff);
558 writeJoystick (cf, " joystick_selectmissile", joystick_selectmissile);
559 writeJoystick (cf, " joystick_targetnearest", joystick_targetnearest);
560 writeJoystick (cf, " joystick_targetlocking", joystick_targetlocking);
561 writeJoystick (cf, " joystick_targetnext", joystick_targetnext);
562 writeJoystick (cf, " joystick_targetprevious", joystick_targetprevious);
563 writeJoystick (cf, " joystick_incthrust", joystick_thrustup);
564 writeJoystick (cf, " joystick_decthrust", joystick_thrustdown);
565 cf->writeText ("\n# This file is meant to give sensible custom interface settings");
566 cf->writeText ("\n# To get back to default settings, just delete this file!");
567 cf->close ();
568 delete cf;
569 }
570
getKey(char * str,int n)571 int getKey (char *str, int n)
572 {
573 int tmp;
574 if (str == NULL) return n;
575 tmp = atoi (str);
576 if (tmp == 0)
577 {
578 if (str [0] >= 33)
579 {
580 return toupper (str [0]);
581 }
582 return n;
583 }
584 return tmp;
585 }
586
getJoystick(char * str,int n)587 int getJoystick (char *str, int n)
588 {
589 int tmp, jn = 0;
590 if (str == NULL) return n;
591 int str0 = toupper (str [0]) - (int) 'A';
592 if (str0 >= -1 && str0 < 10)
593 jn = str0;
594 else
595 return n;
596 tmp = atoi (&str [1]);
597 return jn * 1000 + tmp;
598 }
599
load_configInterface()600 int load_configInterface ()
601 {
602 char buf [STDSIZE];
603 char ret [256];
604 char *str;
605 char *confname = dirs->getSaves ("conf.interface");
606 sprintf (buf, "Loading %s ", confname);
607 display (buf, LOG_MOST);
608 ConfigFile *cf = new ConfigFile (confname);
609
610 str = cf->getString (ret, "key_firecannon");
611 key_firecannon = getKey (str, 32);
612
613 str = cf->getString (ret, "key_firemissile");
614 key_firemissile = getKey (str, 13);
615
616 str = cf->getString (ret, "key_dropchaff");
617 key_dropchaff = getKey (str, 'C');
618
619 str = cf->getString (ret, "key_dropflare");
620 key_dropflare = getKey (str, 'F');
621
622 str = cf->getString (ret, "key_selectmissile");
623 key_selectmissile = getKey (str, 'M');
624
625 str = cf->getString (ret, "key_targetnearest");
626 key_targetnearest = getKey (str, 'E');
627
628 str = cf->getString (ret, "key_targetlocking");
629 key_targetlocking = getKey (str, 'L');
630
631 str = cf->getString (ret, "key_targetnext");
632 key_targetnext = getKey (str, 'T');
633
634 str = cf->getString (ret, "key_targetprevious");
635 key_targetprevious = getKey (str, 'P');
636
637 str = cf->getString (ret, "key_incthrust");
638 key_thrustup = getKey (str, 'S');
639
640 str = cf->getString (ret, "key_decthrust");
641 key_thrustdown = getKey (str, 'X');
642
643 str = cf->getString (ret, "mouse_sensitivity");
644 if (str == NULL)
645 { mouse_sensitivity = 100; }
646 else
647 { mouse_sensitivity = atoi (str); }
648 if (mouse_sensitivity < 70) mouse_sensitivity = 70;
649 else if (mouse_sensitivity > 200) mouse_sensitivity = 200;
650
651 str = cf->getString (ret, "mouse_reverse");
652 if (str == NULL)
653 { mouse_reverse = false; }
654 else
655 { mouse_reverse = (atoi (str) != 0); }
656
657 str = cf->getString (ret, "mouse_relative");
658 if (str == NULL)
659 { mouse_relative = false; }
660 else
661 { mouse_relative = (atoi (str) != 0); }
662
663 str = cf->getString (ret, "mouse_autorudder");
664 if (str == NULL)
665 { mouse_autorudder = 30; }
666 else
667 { mouse_autorudder = atoi (str); }
668 if (mouse_autorudder < 0) mouse_autorudder = 0;
669 else if (mouse_autorudder > 100) mouse_autorudder = 100;
670
671 int mousebutton = 1;
672 str = cf->getString (ret, "mouse_firecannon");
673 if (str == NULL)
674 { mousebutton = 1; }
675 else
676 { mousebutton = atoi (str); }
677 if (mousebutton == 2) mouse_firecannon = MOUSE_BUTTON_MIDDLE;
678 else if (mousebutton == 3) mouse_firecannon = MOUSE_BUTTON_RIGHT;
679 else mouse_firecannon = MOUSE_BUTTON_LEFT;
680
681 str = cf->getString (ret, "mouse_firemissile");
682 if (str == NULL)
683 { mousebutton = 3; }
684 else
685 { mousebutton = atoi (str); }
686 if (mousebutton == 2) mouse_firemissile = MOUSE_BUTTON_MIDDLE;
687 else if (mousebutton == 3) mouse_firemissile = MOUSE_BUTTON_RIGHT;
688 else mouse_firemissile = MOUSE_BUTTON_LEFT;
689
690 str = cf->getString (ret, "mouse_selectmissile");
691 if (str == NULL)
692 { mousebutton = 2; }
693 else
694 { mousebutton = atoi (str); }
695 if (mousebutton == 2) mouse_selectmissile = MOUSE_BUTTON_MIDDLE;
696 else if (mousebutton == 3) mouse_selectmissile = MOUSE_BUTTON_RIGHT;
697 else mouse_selectmissile = MOUSE_BUTTON_LEFT;
698
699 str = cf->getString (ret, "joystick_aileron");
700 joystick_aileron = getJoystick (str, 0);
701
702 str = cf->getString (ret, "joystick_elevator");
703 joystick_elevator = getJoystick (str, 1);
704
705 str = cf->getString (ret, "joystick_throttle");
706 joystick_throttle = getJoystick (str, 2);
707
708 str = cf->getString (ret, "joystick_rudder");
709 joystick_rudder = getJoystick (str, 3);
710
711 str = cf->getString (ret, "joystick_view_x");
712 joystick_view_x = getJoystick (str, 4);
713
714 str = cf->getString (ret, "joystick_view_y");
715 joystick_view_y = getJoystick (str, 5);
716
717 str = cf->getString (ret, "joystick_firecannon");
718 joystick_firecannon = getJoystick (str, 0);
719
720 str = cf->getString (ret, "joystick_firemissile");
721 joystick_firemissile = getJoystick (str, 2);
722
723 str = cf->getString (ret, "joystick_dropchaff");
724 joystick_dropchaff = getJoystick (str, 3);
725
726 str = cf->getString (ret, "joystick_dropflare");
727 joystick_dropflare = getJoystick (str, 3);
728
729 str = cf->getString (ret, "joystick_selectmissile");
730 joystick_selectmissile = getJoystick (str, 1);
731
732 str = cf->getString (ret, "joystick_targetnearest");
733 joystick_targetnearest = getJoystick (str, 101);
734
735 str = cf->getString (ret, "joystick_targetlocking");
736 joystick_targetlocking = getJoystick (str, 103);
737
738 str = cf->getString (ret, "joystick_targetnext");
739 joystick_targetnext = getJoystick (str, 100);
740
741 str = cf->getString (ret, "joystick_targetprevious");
742 joystick_targetprevious = getJoystick (str, 102);
743
744 str = cf->getString (ret, "joystick_incthrust");
745 joystick_thrustup = getJoystick (str, 4);
746
747 str = cf->getString (ret, "joystick_decthrust");
748 joystick_thrustdown = getJoystick (str, 5);
749
750 if (cf->buf [0] == 0) // no file found
751 {
752 delete cf;
753 return 0;
754 }
755
756 delete cf;
757 return 1;
758 }
759
760 #endif
761