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

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