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

Last change on this file since 149 was 149, checked in by holiday, 14 years ago

EXPDATADIR from ./configure now written into new abuserc files

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