source: abuse/trunk/src/sdlport/setup.cpp @ 2

Last change on this file since 2 was 2, checked in by Sam Hocevar, 14 years ago
  • imported original 0.7.0 tarball
File size: 10.8 KB
Line 
1/************************
2 * setup.c
3 * SDL port for Abuse
4 * by Anthony Kruize
5 ************************/
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <sys/stat.h>
10#include <signal.h>
11#include <SDL.h>
12#ifdef HAVE_OPENGL
13#ifdef __APPLE__
14#include <OpenGL/gl.h>
15#include <OpenGL/glu.h>
16#else
17#include <GL/gl.h>
18#include <GL/glu.h>
19#endif  /* __APPLE__ */
20#endif  /* HAVE_OPENGL */
21#include "specs.hpp"
22#include "keys.hpp"
23#include "setup.h"
24
25flags_struct flags;
26keys_struct keys;
27
28extern unsigned int xres, yres;
29static unsigned int scale;
30
31//
32// Display help
33//
34void showHelp()
35{
36        printf( "\n" );
37        printf( "Usage: abuse.sdl [options]\n" );
38        printf( "Options:\n\n" );
39        printf( "** Abuse Options **\n" );
40        printf( "  -size <arg>       Set the size of the screen\n" );
41        printf( "  -edit             Startup in editor mode\n" );
42        printf( "  -f <arg>          Load map file named <arg>\n" );
43        printf( "  -lisp             Startup in lisp interpreter mode\n" );
44        printf( "  -nodelay          Run at maximum speed\n" );
45        printf( "\n" );
46        printf( "** Abuse-SDL Options **\n" );
47        printf( "  -datadir <arg>    Set the location of the game data to <arg>\n" );
48        printf( "  -doublebuf        Enable double buffering\n" );
49        printf( "  -fullscreen       Enable fullscreen mode\n" );
50#ifdef HAVE_OPENGL
51        printf( "  -gl               Enable OpenGL\n" );
52        printf( "  -antialias        Enable anti-aliasing (with -gl only)\n" );
53#endif
54        printf( "  -h, --help        Display this text\n" );
55        printf( "  -mono             Disable stereo sound\n" );
56        printf( "  -nosound          Disable sound\n" );
57        printf( "  -scale <arg>      Scale to <arg>\n" );
58//      printf( "  -x <arg>          Set the width to <arg>\n" );
59//      printf( "  -y <arg>          Set the height to <arg>\n" );
60        printf( "\n" );
61        printf( "Anthony Kruize <trandor@labyrinth.net.au>\n" );
62        printf( "\n" );
63}
64
65//
66// Create a default 'abuserc' file
67//
68void createRCFile( char *rcfile )
69{
70        FILE *fd = NULL;
71
72        if( (fd = fopen( rcfile, "w" )) != NULL )
73        {
74                fputs( "; Abuse-SDL Configuration file\n\n", fd );
75                fputs( "; Location of the datafiles\ndatadir=/usr/local/share/games/abuse\n\n", fd );
76                fputs( "; Startup fullscreen\nfullscreen=0\n\n", fd );
77                fputs( "; Use DoubleBuffering\ndoublebuf=0\n\n", fd );
78                fputs( "; Use mono audio only\nmono=0\n\n", fd );
79                fputs( "; Grab the mouse to the window\ngrabmouse=0\n\n", fd );
80                fputs( "; Set the scale factor\nscale=2\n\n", fd );
81                fputs( "; Use OpenGL\ngl=0\n\n", fd );
82                fputs( "; Use anti-aliasing (with gl=1 only)\nantialias=1\n\n", fd );
83//              fputs( "; Set the width of the window\nx=320\n\n", fd );
84//              fputs( "; Set the height of the window\ny=200\n\n", fd );
85                fputs( "; Disable the SDL parachute in the case of a crash\nnosdlparachute=0\n\n", fd );
86                fputs( "; Key mappings\n", fd );
87                fputs( "left=LEFT\nright=RIGHT\nup=UP\ndown=DOWN\n", fd );
88                fputs( "fire=SPACE\nweapprev=CTRL_R\nweapnext=INSERT\n", fd );
89                fclose( fd );
90        }
91        else
92        {
93                printf( "Unable to create 'abuserc' file.\n" );
94        }
95}
96
97//
98// Read in the 'abuserc' file
99//
100void readRCFile()
101{
102        FILE *fd = NULL;
103        char *rcfile;
104        char buf[255];
105        char *result;
106
107        rcfile = (char *)jmalloc( strlen( get_save_filename_prefix() ) + 9, "rcfile" );
108        sprintf( rcfile, "%s/abuserc\0", get_save_filename_prefix() );
109        if( (fd = fopen( rcfile, "r" )) != NULL )
110        {
111                while( fgets( buf, sizeof( buf ), fd ) != NULL )
112                {
113                        result = strtok( buf, "=" );
114                        if( strcasecmp( result, "fullscreen" ) == 0 )
115                        {
116                                result = strtok( NULL, "\n" );
117                                flags.fullscreen = atoi( result );
118                        }
119                        else if( strcasecmp( result, "doublebuf" ) == 0 )
120                        {
121                                result = strtok( NULL, "\n" );
122                                flags.doublebuf = atoi( result );
123                        }
124                        else if( strcasecmp( result, "mono" ) == 0 )
125                        {
126                                result = strtok( NULL, "\n" );
127                                flags.mono = atoi( result );
128                        }
129                        else if( strcasecmp( result, "grabmouse" ) == 0 )
130                        {
131                                result = strtok( NULL, "\n" );
132                                flags.grabmouse = atoi( result );
133                        }
134                        else if( strcasecmp( result, "scale" ) == 0 )
135                        {
136                                result = strtok( NULL, "\n" );
137                                scale = atoi( result );
138//                              flags.xres = xres * atoi( result );
139//                              flags.yres = yres * atoi( result );
140                        }
141/*                      else if( strcasecmp( result, "x" ) == 0 )
142                        {
143                                result = strtok( NULL, "\n" );
144                                flags.xres = atoi( result );
145                        }
146                        else if( strcasecmp( result, "y" ) == 0 )
147                        {
148                                result = strtok( NULL, "\n" );
149                                flags.yres = atoi( result );
150                        }*/
151                        else if( strcasecmp( result, "gl" ) == 0 )
152                        {
153                                // We leave this in even if we don't have OpenGL so we can
154                                // at least inform the user.
155                                result = strtok( NULL, "\n" );
156                                flags.gl = atoi( result );
157                        }
158#ifdef HAVE_OPENGL
159                        else if( strcasecmp( result, "antialias" ) == 0 )
160                        {
161                                result = strtok( NULL, "\n" );
162                                if( atoi( result ) )
163                                {
164                                        flags.antialias = GL_LINEAR;
165                                }
166                        }
167#endif
168                        else if( strcasecmp( result, "nosdlparachute" ) == 0 )
169                        {
170                                result = strtok( NULL, "\n" );
171                                flags.nosdlparachute = atoi( result );
172                        }
173                        else if( strcasecmp( result, "datadir" ) == 0 )
174                        {
175                                result = strtok( NULL, "\n" );
176                                set_filename_prefix( result );
177                        }
178                        else if( strcasecmp( result, "left" ) == 0 )
179                        {
180                                result = strtok( NULL,"\n" );
181                                keys.left = key_value( result );
182                        }
183                        else if( strcasecmp( result, "right" ) == 0 )
184                        {
185                                result = strtok( NULL,"\n" );
186                                keys.right = key_value( result );
187                        }
188                        else if( strcasecmp( result, "up" ) == 0 )
189                        {
190                                result = strtok( NULL,"\n" );
191                                keys.up = key_value( result );
192                        }
193                        else if( strcasecmp( result, "down" ) == 0 )
194                        {
195                                result = strtok( NULL,"\n" );
196                                keys.down = key_value( result );
197                        }
198                        else if( strcasecmp( result, "fire" ) == 0 )
199                        {
200                                result = strtok( NULL,"\n" );
201                                keys.b2 = key_value( result );
202                        }
203                        else if( strcasecmp( result, "special" ) == 0 )
204                        {
205                                result = strtok( NULL,"\n" );
206                                keys.b1 = key_value( result );
207                        }
208                        else if( strcasecmp( result, "weapprev" ) == 0 )
209                        {
210                                result = strtok( NULL,"\n" );
211                                keys.b3 = key_value( result );
212                        }
213                        else if( strcasecmp( result, "weapnext" ) == 0 )
214                        {
215                                result = strtok( NULL,"\n" );
216                                keys.b4 = key_value( result );
217                        }
218                }
219                fclose( fd );
220        }
221        else
222        {
223                // Couldn't open the abuserc file so let's create a default one
224                createRCFile( rcfile );
225        }
226        jfree( rcfile );
227}
228
229//
230// Parse the command-line parameters
231//
232void parseCommandLine( int argc, char **argv )
233{
234        for( int ii = 1; ii < argc; ii++ )
235        {
236                if( !strcasecmp( argv[ii], "-fullscreen" ) )
237                {
238                        flags.fullscreen = 1;
239                }
240                else if( !strcasecmp( argv[ii], "-doublebuf" ) )
241                {
242                        flags.doublebuf = 1;
243                }
244                else if( !strcasecmp( argv[ii], "-size" ) )
245                {
246                        if( !sscanf( argv[++ii], "%d", &xres ) )
247                        {
248                                xres = 320;
249                        }
250                        if( !sscanf( argv[++ii], "%d", &yres ) )
251                        {
252                                yres = 200;
253                        }
254                }
255                else if( !strcasecmp( argv[ii], "-scale" ) )
256                {
257                        int result;
258                        if( sscanf( argv[++ii], "%d", &result ) )
259                        {
260                                scale = result;
261/*                              flags.xres = xres * scale;
262                                flags.yres = yres * scale;*/
263                        }
264                }
265/*              else if( !strcasecmp( argv[ii], "-x" ) )
266                {
267                        int x;
268                        if( sscanf( argv[++ii], "%d", &x ) )
269                        {
270                                flags.xres = x;
271                        }
272                }
273                else if( !strcasecmp( argv[ii], "-y" ) )
274                {
275                        int y;
276                        if( sscanf( argv[++ii], "%d", &y ) )
277                        {
278                                flags.yres = y;
279                        }
280                }*/
281                else if( !strcasecmp( argv[ii], "-nosound" ) )
282                {
283                        flags.nosound = 1;
284                }
285                else if( !strcasecmp( argv[ii], "-gl" ) )
286                {
287                        // We leave this in even if we don't have OpenGL so we can
288                        // at least inform the user.
289                        flags.gl = 1;
290                }
291#ifdef HAVE_OPENGL
292                else if( !strcasecmp( argv[ii], "-antialias" ) )
293                {
294                        flags.antialias = GL_LINEAR;
295                }
296#endif
297                else if( !strcasecmp( argv[ii], "-mono" ) )
298                {
299                        flags.mono = 1;
300                }
301                else if( !strcasecmp( argv[ii], "-datadir" ) )
302                {
303                        char datadir[255];
304                        if( sscanf( argv[++ii], "%s", datadir ) )
305                        {
306                                set_filename_prefix( datadir );
307                        }
308                }
309                else if( !strcasecmp( argv[ii], "-h" ) || !strcasecmp( argv[ii], "--help" ) )
310                {
311                        showHelp();
312                        exit( 0 );
313                }
314        }
315}
316
317//
318// Setup SDL and configuration
319//
320void setup( int argc, char **argv )
321{
322        // Initialise default settings
323        flags.fullscreen                = 0;                    // Start in a window
324        flags.doublebuf                 = 0;                    // No double buffering
325        flags.mono                              = 0;                    // Enable stereo sound
326        flags.nosound                   = 0;                    // Enable sound
327        flags.grabmouse                 = 0;                    // Don't grab the mouse
328        flags.nosdlparachute    = 0;                    // SDL error handling
329        flags.xres = xres               = 320;                  // Default window width
330        flags.yres = yres               = 200;                  // Default window height
331        flags.gl                                = 0;                    // Don't use opengl
332#ifdef HAVE_OPENGL
333        flags.antialias                 = GL_NEAREST;   // Don't anti-alias
334#endif
335        keys.up                                 = key_value( "UP" );
336        keys.down                               = key_value( "DOWN" );
337        keys.left                               = key_value( "LEFT" );
338        keys.right                              = key_value( "RIGHT" );
339        keys.b3                                 = key_value( "CTRL_R" );
340        keys.b4                                 = key_value( "INSERT" );
341        scale                                   = 2;                    // Default scale amount
342
343        // Display our name and version
344        printf( "%s %s\n", PACKAGE, VERSION );
345
346        // Initialize SDL with video and audio support
347        if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 )
348        {
349                printf( "Unable to initialise SDL : %s\n", SDL_GetError() );
350                exit( 1 );
351        }
352        atexit( SDL_Quit );
353
354        // Set the savegame directory
355        char *homedir;
356        char *savedir;
357        FILE *fd = NULL;
358
359        if( (homedir = getenv( "HOME" )) != NULL )
360        {
361                savedir = (char *)jmalloc( strlen( homedir ) + 8, "savedir" );
362                sprintf( savedir, "%s/.abuse/\0", homedir );
363                // Check if we already have a savegame directory
364                if( (fd = fopen( savedir, "r" )) == NULL )
365                {
366                        // FIXME: Add some error checking here
367                        mkdir( savedir, S_IRUSR | S_IWUSR | S_IXUSR );
368                }
369                else
370                {
371                        fclose( fd );
372                }
373                set_save_filename_prefix( savedir );
374                jfree( savedir );
375        }
376        else
377        {
378                // Warn the user that we couldn't set the savename prefix
379                printf( "WARNING: Unable to get $HOME environment variable.\n" );
380                printf( "         Savegames will probably fail.\n" );
381                // Just use the working directory.
382                // Hopefully they have write permissions....
383                set_save_filename_prefix( "" );
384        }
385
386        // Set the datadir to a default value
387        // (The current directory)
388        set_filename_prefix( EXPDATADIR );
389
390        // Load the users configuration
391        readRCFile();
392
393        // Handle command-line parameters
394        parseCommandLine( argc, argv );
395
396        // Calculate the scaled window size.
397        flags.xres = xres * scale;
398        flags.yres = yres * scale;
399
400        // Stop SDL handling some errors
401        if( flags.nosdlparachute )
402        {
403                // segmentation faults
404                signal( SIGSEGV, SIG_DFL );
405                // floating point errors
406                signal( SIGFPE, SIG_DFL );
407        }
408}
409
410//
411// Get the key binding for the requested function
412//
413int get_key_binding( char *dir, int i )
414{
415        if( strcasecmp( dir, "left" ) == 0 )
416        {
417                return keys.left;
418        }
419        else if( strcasecmp( dir, "right" ) == 0 )
420        {
421                return keys.right;
422        }
423        else if( strcasecmp( dir, "up" ) == 0 )
424        {
425                return keys.up;
426        }
427        else if( strcasecmp( dir, "down" ) == 0 )
428        {
429                return keys.down;
430        }
431        else if( strcasecmp( dir, "b1" ) == 0 )
432        {
433                return keys.b1;
434        }
435        else if( strcasecmp( dir, "b2" ) == 0 )
436        {
437                return keys.b2;
438        }
439        else if( strcasecmp( dir, "b3" ) == 0 )
440        {
441                return keys.b3;
442        }
443        else if( strcasecmp( dir, "b4" ) == 0 )
444        {
445                return keys.b4;
446        }
447        return 0;
448}
Note: See TracBrowser for help on using the repository browser.