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

Last change on this file since 579 was 555, checked in by Sam Hocevar, 12 years ago

ps3: make everything compile on the PS3. Of course, nothing links yet
because so much support is missing.

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