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

Last change on this file since 97 was 97, checked in by Sam Hocevar, 14 years ago
  • Updated the Mac OS X port, thanks to Julian Mayer.
File size: 14.8 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        fputs( "; Abuse-SDL Configuration file\n\n", fd );
93        fputs( "; Startup fullscreen\nfullscreen=0\n\n", fd );
94                #ifdef __APPLE__
95        fputs( "; Use DoubleBuffering\ndoublebuf=1\n\n", fd );
96        fputs( "; Use OpenGL\ngl=1\n\n", fd );
97        #else
98                fputs( "; Use DoubleBuffering\ndoublebuf=0\n\n", fd );
99        fputs( "; Use OpenGL\ngl=0\n\n", fd );
100        fputs( "; Location of the datafiles\ndatadir=/var/games/abuse\n\n", fd );
101                #endif
102                fputs( "; Use mono audio only\nmono=0\n\n", fd );
103        fputs( "; Grab the mouse to the window\ngrabmouse=0\n\n", fd );
104        fputs( "; Set the scale factor\nscale=2\n\n", fd );
105                fputs( "; Use anti-aliasing (with gl=1 only)\nantialias=1\n\n", fd );
106//        fputs( "; Set the width of the window\nx=320\n\n", fd );
107//        fputs( "; Set the height of the window\ny=200\n\n", fd );
108        fputs( "; Disable the SDL parachute in the case of a crash\nnosdlparachute=0\n\n", fd );
109        fputs( "; Key mappings\n", fd );
110        fputs( "left=LEFT\nright=RIGHT\nup=UP\ndown=DOWN\n", fd );
111        fputs( "fire=SPACE\nweapprev=CTRL_R\nweapnext=INSERT\n", fd );
112        fclose( fd );
113    }
114    else
115    {
116        printf( "Unable to create 'abuserc' file.\n" );
117    }
118}
119
120//
121// Read in the 'abuserc' file
122//
123void readRCFile()
124{
125    FILE *fd = NULL;
126    char *rcfile;
127    char buf[255];
128    char *result;
129
130    rcfile = (char *)jmalloc( strlen( get_save_filename_prefix() ) + 9, "rcfile" );
131    sprintf( rcfile, "%s/abuserc", get_save_filename_prefix() );
132    if( (fd = fopen( rcfile, "r" )) != NULL )
133    {
134        while( fgets( buf, sizeof( buf ), fd ) != NULL )
135        {
136            result = strtok( buf, "=" );
137            if( strcasecmp( result, "fullscreen" ) == 0 )
138            {
139                result = strtok( NULL, "\n" );
140                flags.fullscreen = atoi( result );
141            }
142            else if( strcasecmp( result, "doublebuf" ) == 0 )
143            {
144                result = strtok( NULL, "\n" );
145                flags.doublebuf = atoi( result );
146            }
147            else if( strcasecmp( result, "mono" ) == 0 )
148            {
149                result = strtok( NULL, "\n" );
150                flags.mono = atoi( result );
151            }
152            else if( strcasecmp( result, "grabmouse" ) == 0 )
153            {
154                result = strtok( NULL, "\n" );
155                flags.grabmouse = atoi( result );
156            }
157            else if( strcasecmp( result, "scale" ) == 0 )
158            {
159                result = strtok( NULL, "\n" );
160                scale = atoi( result );
161//                flags.xres = xres * atoi( result );
162//                flags.yres = yres * atoi( result );
163            }
164/*            else if( strcasecmp( result, "x" ) == 0 )
165            {
166                result = strtok( NULL, "\n" );
167                flags.xres = atoi( result );
168            }
169            else if( strcasecmp( result, "y" ) == 0 )
170            {
171                result = strtok( NULL, "\n" );
172                flags.yres = atoi( result );
173            }*/
174            else if( strcasecmp( result, "gl" ) == 0 )
175            {
176                // We leave this in even if we don't have OpenGL so we can
177                // at least inform the user.
178                result = strtok( NULL, "\n" );
179                flags.gl = atoi( result );
180            }
181#ifdef HAVE_OPENGL
182            else if( strcasecmp( result, "antialias" ) == 0 )
183            {
184                result = strtok( NULL, "\n" );
185                if( atoi( result ) )
186                {
187                    flags.antialias = GL_LINEAR;
188                }
189            }
190#endif
191            else if( strcasecmp( result, "nosdlparachute" ) == 0 )
192            {
193                result = strtok( NULL, "\n" );
194                flags.nosdlparachute = atoi( result );
195            }
196            else if( strcasecmp( result, "datadir" ) == 0 )
197            {
198                result = strtok( NULL, "\n" );
199                set_filename_prefix( result );
200            }
201            else if( strcasecmp( result, "left" ) == 0 )
202            {
203                result = strtok( NULL,"\n" );
204                keys.left = key_value( result );
205            }
206            else if( strcasecmp( result, "right" ) == 0 )
207            {
208                result = strtok( NULL,"\n" );
209                keys.right = key_value( result );
210            }
211            else if( strcasecmp( result, "up" ) == 0 )
212            {
213                result = strtok( NULL,"\n" );
214                keys.up = key_value( result );
215            }
216            else if( strcasecmp( result, "down" ) == 0 )
217            {
218                result = strtok( NULL,"\n" );
219                keys.down = key_value( result );
220            }
221            else if( strcasecmp( result, "fire" ) == 0 )
222            {
223                result = strtok( NULL,"\n" );
224                keys.b2 = key_value( result );
225            }
226            else if( strcasecmp( result, "special" ) == 0 )
227            {
228                result = strtok( NULL,"\n" );
229                keys.b1 = key_value( result );
230            }
231            else if( strcasecmp( result, "weapprev" ) == 0 )
232            {
233                result = strtok( NULL,"\n" );
234                keys.b3 = key_value( result );
235            }
236            else if( strcasecmp( result, "weapnext" ) == 0 )
237            {
238                result = strtok( NULL,"\n" );
239                keys.b4 = key_value( result );
240            }
241        }
242        fclose( fd );
243    }
244    else
245    {
246        // Couldn't open the abuserc file so let's create a default one
247        createRCFile( rcfile );
248    }
249    jfree( rcfile );
250}
251
252//
253// Parse the command-line parameters
254//
255void parseCommandLine( int argc, char **argv )
256{
257    for( int ii = 1; ii < argc; ii++ )
258    {
259        if( !strcasecmp( argv[ii], "-fullscreen" ) )
260        {
261            flags.fullscreen = 1;
262        }
263        else if( !strcasecmp( argv[ii], "-doublebuf" ) )
264        {
265            flags.doublebuf = 1;
266        }
267        else if( !strcasecmp( argv[ii], "-size" ) )
268        {
269            if( !sscanf( argv[++ii], "%d", &xres ) )
270            {
271                xres = 320;
272            }
273            if( !sscanf( argv[++ii], "%d", &yres ) )
274            {
275                yres = 200;
276            }
277        }
278        else if( !strcasecmp( argv[ii], "-scale" ) )
279        {
280            int result;
281            if( sscanf( argv[++ii], "%d", &result ) )
282            {
283                scale = result;
284/*                flags.xres = xres * scale;
285                flags.yres = yres * scale;*/
286            }
287        }
288/*        else if( !strcasecmp( argv[ii], "-x" ) )
289        {
290            int x;
291            if( sscanf( argv[++ii], "%d", &x ) )
292            {
293                flags.xres = x;
294            }
295        }
296        else if( !strcasecmp( argv[ii], "-y" ) )
297        {
298            int y;
299            if( sscanf( argv[++ii], "%d", &y ) )
300            {
301                flags.yres = y;
302            }
303        }*/
304        else if( !strcasecmp( argv[ii], "-nosound" ) )
305        {
306            flags.nosound = 1;
307        }
308        else if( !strcasecmp( argv[ii], "-gl" ) )
309        {
310            // We leave this in even if we don't have OpenGL so we can
311            // at least inform the user.
312            flags.gl = 1;
313        }
314#ifdef HAVE_OPENGL
315        else if( !strcasecmp( argv[ii], "-antialias" ) )
316        {
317            flags.antialias = GL_LINEAR;
318        }
319#endif
320        else if( !strcasecmp( argv[ii], "-mono" ) )
321        {
322            flags.mono = 1;
323        }
324        else if( !strcasecmp( argv[ii], "-datadir" ) )
325        {
326            char datadir[255];
327            if( sscanf( argv[++ii], "%s", datadir ) )
328            {
329                set_filename_prefix( datadir );
330            }
331        }
332        else if( !strcasecmp( argv[ii], "-h" ) || !strcasecmp( argv[ii], "--help" ) )
333        {
334            showHelp();
335            exit( 0 );
336        }
337    }
338}
339
340//
341// Setup SDL and configuration
342//
343void setup( int argc, char **argv )
344{
345    // Initialise default settings
346    flags.fullscreen        = 0;            // Start in a window
347    flags.mono                = 0;            // Enable stereo sound
348    flags.nosound            = 0;            // Enable sound
349    flags.grabmouse            = 0;            // Don't grab the mouse
350    flags.nosdlparachute    = 0;            // SDL error handling
351    flags.xres = xres        = 320;            // Default window width
352    flags.yres = yres        = 200;            // Default window height
353#ifdef __APPLE__       
354    flags.gl                = 1;            // Use opengl
355    flags.doublebuf            = 1;            // Do double buffering
356#else
357    flags.gl                = 0;            // Don't use opengl
358    flags.doublebuf            = 0;            // No double buffering
359        #endif
360#ifdef HAVE_OPENGL
361    flags.antialias            = GL_NEAREST;    // Don't anti-alias
362#endif
363    keys.up                    = key_value( "UP" );
364    keys.down                = key_value( "DOWN" );
365    keys.left                = key_value( "LEFT" );
366    keys.right                = key_value( "RIGHT" );
367    keys.b3                    = key_value( "CTRL_R" );
368    keys.b4                    = key_value( "INSERT" );
369    scale                    = 2;            // Default scale amount
370
371    // Display our name and version
372    printf( "%s %s\n", PACKAGE_NAME, PACKAGE_VERSION );
373
374    // Initialize SDL with video and audio support
375    if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 )
376    {
377        printf( "Unable to initialise SDL : %s\n", SDL_GetError() );
378        exit( 1 );
379    }
380    atexit( SDL_Quit );
381
382    // Set the savegame directory
383    char *homedir;
384    char *savedir;
385    FILE *fd = NULL;
386
387    if( (homedir = getenv( "HOME" )) != NULL )
388    {
389        savedir = (char *)jmalloc( strlen( homedir ) + 9, "savedir" );
390        sprintf( savedir, "%s/.abuse/", homedir );
391        // Check if we already have a savegame directory
392        if( (fd = fopen( savedir, "r" )) == NULL )
393        {
394            // FIXME: Add some error checking here
395            mkdir( savedir, S_IRUSR | S_IWUSR | S_IXUSR );
396        }
397        else
398        {
399            fclose( fd );
400        }
401        set_save_filename_prefix( savedir );
402        jfree( savedir );
403    }
404    else
405    {
406        // Warn the user that we couldn't set the savename prefix
407        printf( "WARNING: Unable to get $HOME environment variable.\n" );
408        printf( "         Savegames will probably fail.\n" );
409        // Just use the working directory.
410        // Hopefully they have write permissions....
411        set_save_filename_prefix( "" );
412    }
413
414    // Set the datadir to a default value
415    // (The current directory)
416        #ifdef __APPLE__
417        UInt8 buffer[255];
418    CFURLRef bundleurl = CFBundleCopyBundleURL(CFBundleGetMainBundle());
419        CFURLRef url = CFURLCreateCopyAppendingPathComponent(kCFAllocatorDefault, bundleurl, CFSTR("Contents/Resources/data"), true);
420       
421        if (!CFURLGetFileSystemRepresentation(url, true, buffer, 255))
422        {
423                exit(1);
424        }
425        else
426                set_filename_prefix( (const char*)buffer );
427        #else
428    set_filename_prefix( EXPDATADIR );
429        #endif
430       
431    // Load the users configuration
432    readRCFile();
433
434    // Handle command-line parameters
435    parseCommandLine( argc, argv );
436
437    // Calculate the scaled window size.
438    flags.xres = xres * scale;
439    flags.yres = yres * scale;
440
441    // Stop SDL handling some errors
442    if( flags.nosdlparachute )
443    {
444        // segmentation faults
445        signal( SIGSEGV, SIG_DFL );
446        // floating point errors
447        signal( SIGFPE, SIG_DFL );
448    }
449}
450
451//
452// Get the key binding for the requested function
453//
454int get_key_binding(char const *dir, int i)
455{
456    if( strcasecmp( dir, "left" ) == 0 )
457        return keys.left;
458    else if( strcasecmp( dir, "right" ) == 0 )
459        return keys.right;
460    else if( strcasecmp( dir, "up" ) == 0 )
461        return keys.up;
462    else if( strcasecmp( dir, "down" ) == 0 )
463        return keys.down;
464    else if( strcasecmp( dir, "b1" ) == 0 )
465        return keys.b1;
466    else if( strcasecmp( dir, "b2" ) == 0 )
467        return keys.b2;
468    else if( strcasecmp( dir, "b3" ) == 0 )
469        return keys.b3;
470    else if( strcasecmp( dir, "b4" ) == 0 )
471        return keys.b4;
472
473    return 0;
474}
Note: See TracBrowser for help on using the repository browser.