dxx-rebirth/similar/misc/args.c

246 lines
6.6 KiB
C
Raw Normal View History

2006-03-20 17:12:09 +00:00
/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* Functions for accessing arguments.
*
*/
#include <stdlib.h>
#include <string.h>
2013-06-30 02:22:56 +00:00
#include <SDL_stdinc.h>
2006-03-20 17:12:09 +00:00
#include "physfsx.h"
#include "args.h"
#include "u_mem.h"
#include "strio.h"
#include "strutil.h"
#include "digi.h"
#include "game.h"
#include "gauges.h"
#include "console.h"
#ifdef USE_UDP
#include "net_udp.h"
#endif
#define MAX_ARGS 1000
#if defined(DXX_BUILD_DESCENT_I)
#define INI_FILENAME "d1x.ini"
#elif defined(DXX_BUILD_DESCENT_II)
#define INI_FILENAME "d2x.ini"
#endif
2013-08-03 15:45:11 +00:00
static int Num_args=0;
static char * Args[MAX_ARGS];
2006-03-20 17:12:09 +00:00
struct Arg GameArg;
2012-09-02 22:48:34 +00:00
static int FindArg(const char *const s)
2006-03-20 17:12:09 +00:00
{
int i;
for (i=0; i<Num_args; i++ )
if (! d_stricmp( Args[i], s))
2006-03-20 17:12:09 +00:00
return i;
return 0;
}
2013-08-03 15:45:11 +00:00
static void AppendIniArgs(void)
{
PHYSFS_file *f;
char *line, *token;
char separator[] = " ";
f = PHYSFSX_openReadBuffered(INI_FILENAME);
if(f) {
while(!PHYSFS_eof(f) && Num_args < MAX_ARGS)
{
line=fgets_unlimited(f);
token = strtok(line, separator); /* first token in current line */
if (token)
Args[Num_args++] = d_strdup(token);
while( token != NULL )
{
token = strtok(NULL, separator); /* next tokens in current line */
if (token)
Args[Num_args++] = d_strdup(token);
}
d_free(line);
}
PHYSFS_close(f);
}
}
// Utility function to get an integer provided as argument
2013-08-03 15:45:11 +00:00
static int get_int_arg(char *arg_name, int default_value) {
int t;
return ((t = FindArg(arg_name)) ? atoi(Args[t+1]) : default_value);
}
// Utility function to get a string provided as argument
2013-08-03 15:45:11 +00:00
static char *get_str_arg(char *arg_name, char *default_value) {
int t;
return ((t = FindArg(arg_name)) ? Args[t+1] : default_value);
}
// All FindArg calls should be here to keep the code clean
2013-08-03 15:45:11 +00:00
static void ReadCmdArgs(void)
{
// System Options
GameArg.SysShowCmdHelp = (FindArg( "-help" ) || FindArg( "-h" ) || FindArg( "-?" ) || FindArg( "?" ));
GameArg.SysUseNiceFPS = !FindArg("-nonicefps");
GameArg.SysMaxFPS = get_int_arg("-maxfps", MAXIMUM_FPS);
if (GameArg.SysMaxFPS <= 0 || GameArg.SysMaxFPS > MAXIMUM_FPS)
GameArg.SysMaxFPS = MAXIMUM_FPS;
2007-10-12 14:21:21 +00:00
GameArg.SysHogDir = get_str_arg("-hogdir", NULL);
if (GameArg.SysHogDir == NULL)
GameArg.SysNoHogDir = FindArg("-nohogdir");
GameArg.SysUsePlayersDir = FindArg("-use_players_dir");
GameArg.SysLowMem = FindArg("-lowmem");
GameArg.SysPilot = get_str_arg("-pilot", NULL);
GameArg.SysWindow = FindArg("-window");
GameArg.SysNoBorders = FindArg("-noborders");
#if defined(DXX_BUILD_DESCENT_I)
GameArg.SysNoTitles = FindArg("-notitles");
#elif defined(DXX_BUILD_DESCENT_II)
GameArg.SysNoMovies = FindArg("-nomovies");
#endif
GameArg.SysAutoDemo = FindArg("-autodemo");
2007-10-01 20:42:35 +00:00
// Control Options
GameArg.CtlNoCursor = FindArg("-nocursor");
GameArg.CtlNoMouse = FindArg("-nomouse");
GameArg.CtlNoJoystick = FindArg("-nojoystick");
GameArg.CtlNoStickyKeys = FindArg("-nostickykeys");
if (GameArg.CtlNoStickyKeys) // Must happen before SDL_Init!
SDL_putenv("SDL_DISABLE_LOCK_KEYS=1");
else
SDL_putenv("SDL_DISABLE_LOCK_KEYS=0");
// Sound Options
GameArg.SndNoSound = FindArg("-nosound");
GameArg.SndNoMusic = FindArg("-nomusic");
#if defined(DXX_BUILD_DESCENT_II)
GameArg.SndDigiSampleRate = (FindArg("-sound11k") ? SAMPLE_RATE_11K : SAMPLE_RATE_22K);
#endif
#ifdef USE_SDLMIXER
GameArg.SndDisableSdlMixer = FindArg("-nosdlmixer");
#else
GameArg.SndDisableSdlMixer = 1;
#endif
// Graphics Options
GameArg.GfxHiresFNTAvailable = !FindArg("-lowresfont");
#if defined(DXX_BUILD_DESCENT_II)
GameArg.GfxHiresGFXAvailable = !FindArg("-lowresgraphics");
GameArg.GfxMovieHires = !FindArg( "-lowresmovies" );
#endif
#ifdef OGL
// OpenGL Options
GameArg.OglFixedFont = FindArg("-gl_fixedfont");
#endif
// Multiplayer Options
#ifdef USE_UDP
GameArg.MplUdpHostAddr = get_str_arg("-udp_hostaddr", UDP_MANUAL_ADDR_DEFAULT);
GameArg.MplUdpHostPort = get_int_arg("-udp_hostport", 0);
GameArg.MplUdpMyPort = get_int_arg("-udp_myport", 0);
#ifdef USE_TRACKER
GameArg.MplTrackerAddr = get_str_arg("-tracker_hostaddr", TRACKER_ADDR_DEFAULT);
GameArg.MplTrackerPort = get_int_arg("-tracker_hostport", TRACKER_PORT_DEFAULT);
#endif
#endif
#if defined(DXX_BUILD_DESCENT_I)
GameArg.EdiNoBm = FindArg("-nobm");
#elif defined(DXX_BUILD_DESCENT_II)
#ifdef EDITOR
// Editor Options
GameArg.EdiAutoLoad = get_str_arg("-autoload", NULL);
GameArg.EdiMacData = FindArg("-macdata");
GameArg.EdiSaveHoardData = FindArg("-hoarddata");
#endif
#endif
// Debug Options
if (FindArg("-debug")) GameArg.DbgVerbose = CON_DEBUG;
else if (FindArg("-verbose")) GameArg.DbgVerbose = CON_VERBOSE;
else GameArg.DbgVerbose = CON_NORMAL;
GameArg.DbgSafelog = FindArg("-safelog");
GameArg.DbgNoRun = FindArg("-norun");
GameArg.DbgRenderStats = FindArg("-renderstats");
GameArg.DbgAltTex = get_str_arg("-text", NULL);
GameArg.DbgTexMap = get_str_arg("-tmap", NULL);
GameArg.DbgShowMemInfo = FindArg("-showmeminfo");
GameArg.DbgUseDoubleBuffer = !FindArg("-nodoublebuffer");
GameArg.DbgBigPig = !FindArg("-bigpig");
GameArg.DbgBpp = (FindArg("-16bpp") ? 16 : 32);
2007-07-22 20:40:39 +00:00
2007-07-22 01:34:00 +00:00
#ifdef OGL
GameArg.DbgAltTexMerge = !FindArg("-gl_oldtexmerge");
GameArg.DbgGlIntensity4Ok = get_int_arg("-gl_intensity4_ok", 1);
GameArg.DbgGlLuminance4Alpha4Ok = get_int_arg("-gl_luminance4_alpha4_ok", 1);
GameArg.DbgGlRGBA2Ok = get_int_arg("-gl_rgba2_ok", 1);
GameArg.DbgGlReadPixelsOk = get_int_arg("-gl_readpixels_ok", 1);
GameArg.DbgGlGetTexLevelParamOk = get_int_arg("-gl_gettexlevelparam_ok", 1);
#else
GameArg.DbgSdlHWSurface = FindArg("-hwsurface");
2008-11-03 11:36:16 +00:00
GameArg.DbgSdlASyncBlit = FindArg("-asyncblit");
2007-07-22 01:34:00 +00:00
#endif
}
2006-03-20 17:12:09 +00:00
void args_exit(void)
{
int i;
for (i=0; i< Num_args; i++ )
d_free(Args[i]);
}
void InitArgs( int argc,char **argv )
{
int i;
2006-03-20 17:12:09 +00:00
Num_args=0;
2006-03-20 17:12:09 +00:00
for (i=0; i<argc; i++ )
Args[Num_args++] = d_strdup( argv[i] );
2006-03-20 17:12:09 +00:00
for (i=0; i< Num_args; i++ ) {
if ( Args[i][0] == '-' )
d_strlwr( Args[i] ); // Convert all args to lowercase
2006-03-20 17:12:09 +00:00
}
AppendIniArgs();
ReadCmdArgs();
2006-03-20 17:12:09 +00:00
}