source: abuse/trunk/src/sdl2port/setup.cpp @ 731

Last change on this file since 731 was 731, checked in by jjsimpso, 4 years ago

sdlport: Add support for SDL2, inculding the game controller API. Configure
script will check for SDL2 and use it if present, otherwise it will fall
back to SDL v1. Some old SDL v1 features not implemented yet on SDL2, such
as saving screenshots.

core: Small change for SDL2 game controller API to disable the game
controller in the save/load game menu.

Summary of game controller API changes:

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