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

Last change on this file since 623 was 623, checked in by Sam Hocevar, 11 years ago

build: fix a problem with --with-assetdir and make sure the flag
name does not have an `s'.

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