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