]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - common.c
R_SetSkyBox now takes a const char *
[xonotic/darkplaces.git] / common.c
index bc7cfea3efd076519b1b3cce5d49e4d0820da6cb..3dfcf6d51577d324702fcf62083d03de5cf9edee 100644 (file)
--- a/common.c
+++ b/common.c
@@ -29,14 +29,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "quakedef.h"
 
-#define NUM_SAFE_ARGVS  7
-
-static char *largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1];
-static char *argvdummy = " ";
-
-static char *safeargvs[NUM_SAFE_ARGVS] =
-       {"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse", "-window"};
-
 cvar_t registered = {0, "registered","0"};
 cvar_t cmdline = {0, "cmdline","0"};
 
@@ -44,15 +36,12 @@ mempool_t *pak_mempool;
 
 qboolean com_modified;   // set true if using non-id files
 
-//qboolean proghack;
-
-//int static_registered = 1;  // only for startup check, then set
-
 qboolean msg_suppress_1 = 0;
 
 void COM_InitFilesystem (void);
 
 char com_token[1024];
+char com_basedir[MAX_OSPATH];
 int com_argc;
 char **com_argv;
 
@@ -62,6 +51,7 @@ char com_cmdline[CMDLINE_LENGTH];
 
 int gamemode;
 char *gamename;
+char *gamedirname;
 
 /*
 
@@ -95,126 +85,6 @@ The file "parms.txt" will be read out of the game directory and appended to the
 ============================================================================
 */
 
-/*
-void Q_memset (void *dest, int fill, int count)
-{
-       int             i;
-
-       if ( (((long)dest | count) & 3) == 0)
-       {
-               count >>= 2;
-               fill = fill | (fill<<8) | (fill<<16) | (fill<<24);
-               for (i=0 ; i<count ; i++)
-                       ((int *)dest)[i] = fill;
-       }
-       else
-               for (i=0 ; i<count ; i++)
-                       ((qbyte *)dest)[i] = fill;
-}
-
-void Q_memcpy (void *dest, void *src, int count)
-{
-       int             i;
-       
-       if (( ( (long)dest | (long)src | count) & 3) == 0 )
-       {
-               count>>=2;
-               for (i=0 ; i<count ; i++)
-                       ((int *)dest)[i] = ((int *)src)[i];
-       }
-       else
-               for (i=0 ; i<count ; i++)
-                       ((qbyte *)dest)[i] = ((qbyte *)src)[i];
-}
-
-int Q_memcmp (void *m1, void *m2, int count)
-{
-       while(count)
-       {
-               count--;
-               if (((qbyte *)m1)[count] != ((qbyte *)m2)[count])
-                       return -1;
-       }
-       return 0;
-}
-
-void Q_strcpy (char *dest, char *src)
-{
-       while (*src)
-       {
-               *dest++ = *src++;
-       }
-       *dest++ = 0;
-}
-
-void Q_strncpy (char *dest, char *src, int count)
-{
-       while (*src && count--)
-       {
-               *dest++ = *src++;
-       }
-       if (count)
-               *dest++ = 0;
-}
-
-int Q_strlen (char *str)
-{
-       int             count;
-       
-       count = 0;
-       while (str[count])
-               count++;
-
-       return count;
-}
-
-char *Q_strrchr(char *s, char c)
-{
-    int len = Q_strlen(s);
-    s += len;
-    while (len--)
-       if (*--s == c) return s;
-    return 0;
-}
-
-void Q_strcat (char *dest, char *src)
-{
-       dest += Q_strlen(dest);
-       Q_strcpy (dest, src);
-}
-
-int Q_strcmp (char *s1, char *s2)
-{
-       while (1)
-       {
-               if (*s1 != *s2)
-                       return -1;              // strings not equal    
-               if (!*s1)
-                       return 0;               // strings are equal
-               s1++;
-               s2++;
-       }
-
-       return -1;
-}
-
-int Q_strncmp (char *s1, char *s2, int count)
-{
-       while (1)
-       {
-               if (!count--)
-                       return 0;
-               if (*s1 != *s2)
-                       return -1;              // strings not equal    
-               if (!*s1)
-                       return 0;               // strings are equal
-               s1++;
-               s2++;
-       }
-
-       return -1;
-}
-*/
 int Q_strncasecmp (char *s1, char *s2, int n)
 {
        int             c1, c2;
@@ -238,8 +108,6 @@ int Q_strncasecmp (char *s1, char *s2, int n)
                }
                if (!c1)
                        return 0;               // strings are equal
-//              s1++;
-//              s2++;
        }
 
        return -1;
@@ -249,141 +117,6 @@ int Q_strcasecmp (char *s1, char *s2)
 {
        return Q_strncasecmp (s1, s2, 99999);
 }
-/*
-int Q_atoi (char *str)
-{
-       int             val;
-       int             sign;
-       int             c;
-
-       if (*str == '-')
-       {
-               sign = -1;
-               str++;
-       }
-       else
-               sign = 1;
-               
-       val = 0;
-
-//
-// check for hex
-//
-       if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X') )
-       {
-               str += 2;
-               while (1)
-               {
-                       c = *str++;
-                       if (c >= '0' && c <= '9')
-                               val = (val<<4) + c - '0';
-                       else if (c >= 'a' && c <= 'f')
-                               val = (val<<4) + c - 'a' + 10;
-                       else if (c >= 'A' && c <= 'F')
-                               val = (val<<4) + c - 'A' + 10;
-                       else
-                               return val*sign;
-               }
-       }
-       
-//
-// check for character
-//
-       if (str[0] == '\'')
-       {
-               return sign * str[1];
-       }
-       
-//
-// assume decimal
-//
-       while (1)
-       {
-               c = *str++;
-               if (c <'0' || c > '9')
-                       return val*sign;
-               val = val*10 + c - '0';
-       }
-       
-       return 0;
-}
-
-
-float Q_atof (char *str)
-{
-       double                  val;
-       int             sign;
-       int             c;
-       int             decimal, total;
-       
-       if (*str == '-')
-       {
-               sign = -1;
-               str++;
-       }
-       else
-               sign = 1;
-               
-       val = 0;
-
-//
-// check for hex
-//
-       if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X') )
-       {
-               str += 2;
-               while (1)
-               {
-                       c = *str++;
-                       if (c >= '0' && c <= '9')
-                               val = (val*16) + c - '0';
-                       else if (c >= 'a' && c <= 'f')
-                               val = (val*16) + c - 'a' + 10;
-                       else if (c >= 'A' && c <= 'F')
-                               val = (val*16) + c - 'A' + 10;
-                       else
-                               return val*sign;
-               }
-       }
-       
-//
-// check for character
-//
-       if (str[0] == '\'')
-       {
-               return sign * str[1];
-       }
-       
-//
-// assume decimal
-//
-       decimal = -1;
-       total = 0;
-       while (1)
-       {
-               c = *str++;
-               if (c == '.')
-               {
-                       decimal = total;
-                       continue;
-               }
-               if (c <'0' || c > '9')
-                       break;
-               val = val*10 + c - '0';
-               total++;
-       }
-
-       if (decimal == -1)
-               return val*sign;
-       while (total > decimal)
-       {
-               val /= 10;
-               total--;
-       }
-
-       return val*sign;
-}
-*/
 
 /*
 ============================================================================
@@ -479,11 +212,6 @@ void MSG_WriteChar (sizebuf_t *sb, int c)
 {
        qbyte    *buf;
        
-//#ifdef PARANOID
-//     if (c < -128 || c > 127)
-//             Sys_Error ("MSG_WriteChar: range error");
-//#endif
-
        buf = SZ_GetSpace (sb, 1);
        buf[0] = c;
 }
@@ -492,11 +220,6 @@ void MSG_WriteByte (sizebuf_t *sb, int c)
 {
        qbyte    *buf;
        
-//#ifdef PARANOID
-//     if (c < 0 || c > 255)
-//             Sys_Error ("MSG_WriteByte: range error");
-//#endif
-
        buf = SZ_GetSpace (sb, 1);
        buf[0] = c;
 }
@@ -505,11 +228,6 @@ void MSG_WriteShort (sizebuf_t *sb, int c)
 {
        qbyte    *buf;
 
-//#ifdef PARANOID
-//     if (c < ((short)0x8000) || c > (short)0x7fff)
-//             Sys_Error ("MSG_WriteShort: range error");
-//#endif
-
        buf = SZ_GetSpace (sb, 2);
        buf[0] = c&0xff;
        buf[1] = c>>8;
@@ -587,45 +305,6 @@ void MSG_BeginReading (void)
        msg_badread = false;
 }
 
-/*
-// returns -1 and sets msg_badread if no more characters are available
-int MSG_ReadChar (void)
-{
-       int     c;
-
-       // LordHavoc: minor optimization
-       if (msg_readcount >= net_message.cursize)
-//     if (msg_readcount+1 > net_message.cursize)
-       {
-               msg_badread = true;
-               return -1;
-       }
-
-       c = (signed char)net_message.data[msg_readcount];
-       msg_readcount++;
-
-       return c;
-}
-
-int MSG_ReadByte (void)
-{
-       int     c;
-
-       // LordHavoc: minor optimization
-       if (msg_readcount >= net_message.cursize)
-//     if (msg_readcount+1 > net_message.cursize)
-       {
-               msg_badread = true;
-               return -1;
-       }
-
-       c = (unsigned char)net_message.data[msg_readcount];
-       msg_readcount++;
-
-       return c;
-}
-*/
-
 int MSG_ReadShort (void)
 {
        int     c;
@@ -721,23 +400,6 @@ float MSG_ReadCoord (void)
                return MSG_ReadShort() * (1.0f/8.0f);
 }
 
-/*
-float MSG_ReadCoord (void)
-{
-       return MSG_ReadShort() * (1.0f/8.0f);
-}
-
-float MSG_ReadAngle (void)
-{
-       return MSG_ReadChar() * (360.0f/256.0f);
-}
-
-float MSG_ReadPreciseAngle (void)
-{
-       return MSG_ReadShort() * (360.0f/65536);
-}
-*/
-
 
 //===========================================================================
 
@@ -772,13 +434,13 @@ void *SZ_GetSpace (sizebuf_t *buf, int length)
        if (buf->cursize + length > buf->maxsize)
        {
                if (!buf->allowoverflow)
-                       Host_Error ("SZ_GetSpace: overflow without allowoverflow set");
+                       Host_Error ("SZ_GetSpace: overflow without allowoverflow set\n");
 
                if (length > buf->maxsize)
-                       Host_Error ("SZ_GetSpace: %i is > full buffer size", length);
+                       Host_Error ("SZ_GetSpace: %i is > full buffer size\n", length);
 
                buf->overflowed = true;
-               Con_Printf ("SZ_GetSpace: overflow");
+               Con_Printf ("SZ_GetSpace: overflow\n");
                SZ_Clear (buf);
        }
 
@@ -796,7 +458,7 @@ void SZ_Write (sizebuf_t *buf, void *data, int length)
 void SZ_Print (sizebuf_t *buf, char *data)
 {
        int             len;
-       
+
        len = strlen(data)+1;
 
 // byte * cast to keep VC++ happy
@@ -806,6 +468,55 @@ void SZ_Print (sizebuf_t *buf, char *data)
                memcpy ((qbyte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0
 }
 
+static char *hexchar = "0123456789ABCDEF";
+void SZ_HexDumpToConsole(sizebuf_t *buf)
+{
+       int i;
+       char text[1024];
+       char *cur, *flushpointer;
+       cur = text;
+       flushpointer = text + 512;
+       for (i = 0;i < buf->cursize;i++)
+       {
+               if ((i & 15) == 0)
+               {
+                       *cur++ = hexchar[(i >> 12) & 15];
+                       *cur++ = hexchar[(i >>  8) & 15];
+                       *cur++ = hexchar[(i >>  4) & 15];
+                       *cur++ = hexchar[(i >>  0) & 15];
+                       *cur++ = ':';
+                       *cur++ = ' ';
+               }
+               else if ((i & 15) == 15)
+                       *cur++ = '\n';
+               else
+                       *cur++ = ' ';
+               if (i & 1)
+               {
+                       *cur++ = hexchar[(buf->data[i] >> 4) & 15] | 0x80;
+                       *cur++ = hexchar[(buf->data[i] >> 0) & 15] | 0x80;
+               }
+               else
+               {
+                       *cur++ = hexchar[(buf->data[i] >> 4) & 15];
+                       *cur++ = hexchar[(buf->data[i] >> 0) & 15];
+               }
+               if (cur >= flushpointer)
+               {
+                       *cur++ = 0;
+                       Con_Printf("%s", text);
+                       cur = text;
+               }
+       }
+       if ((i & 15) != 0)
+               *cur++ = '\n';
+       if (cur > text)
+       {
+               *cur++ = 0;
+               Con_Printf("%s", text);
+       }
+}
+
 
 //============================================================================
 
@@ -841,13 +552,15 @@ void COM_StripExtension (char *in, char *out)
        while (*in)
        {
                if (*in == '.')
-                       last = in;
-               if ((*in == '/') || (*in == '\\') || (*in == ':'))
+                       last = out;
+               else if (*in == '/' || *in == '\\' || *in == ':')
                        last = NULL;
                *out++ = *in++;
        }
        if (last)
                *last = 0;
+       else
+               *out = 0;
 }
 
 /*
@@ -956,7 +669,7 @@ skipwhite:
                        return NULL;                    // end of file;
                data++;
        }
-       
+
 // skip // comments
        if (c=='/' && data[1] == '/')
        {
@@ -1045,26 +758,16 @@ void COM_CheckRegistered (void)
 {
        Cvar_Set ("cmdline", com_cmdline);
 
-//     static_registered = 0;
-
        if (!Sys_FileTime("gfx/pop.lmp"))
        {
                if (com_modified)
                        Con_Printf ("Playing shareware version, with modification.\nwarning: most mods require full quake data.\n");
                else
                        Con_Printf ("Playing shareware version.\n");
-//#if WINDED
-//     Sys_Error ("This dedicated server requires a full registered copy of Quake");
-//#endif
-//             Con_Printf ("Playing shareware version.\n");
-//             if (com_modified)
-//                     Sys_Error ("You must have the registered version to use modified games");
                return;
        }
 
-//     Cvar_Set ("cmdline", com_cmdline);
        Cvar_Set ("registered", "1");
-//     static_registered = 1;
        Con_Printf ("Playing registered version.\n");
 }
 
@@ -1077,95 +780,76 @@ void COM_Path_f (void);
 COM_InitArgv
 ================
 */
-void COM_InitArgv (int argc, char **argv)
+void COM_InitArgv (void)
 {
-       qboolean        safe;
-       int             i, j, n;
-
-// reconstitute the command line for the cmdline externally visible cvar
+       int i, j, n;
+       // reconstitute the command line for the cmdline externally visible cvar
        n = 0;
-
-       for (j=0 ; (j<MAX_NUM_ARGVS) && (j< argc) ; j++)
+       for (j = 0;(j < MAX_NUM_ARGVS) && (j < com_argc);j++)
        {
                i = 0;
-
-               while ((n < (CMDLINE_LENGTH - 1)) && argv[j][i])
-               {
-                       com_cmdline[n++] = argv[j][i++];
-               }
-
+               while ((n < (CMDLINE_LENGTH - 1)) && com_argv[j][i])
+                       com_cmdline[n++] = com_argv[j][i++];
                if (n < (CMDLINE_LENGTH - 1))
                        com_cmdline[n++] = ' ';
                else
                        break;
        }
-
        com_cmdline[n] = 0;
+}
 
-       safe = false;
-
-       for (com_argc=0 ; (com_argc<MAX_NUM_ARGVS) && (com_argc < argc) ;
-                com_argc++)
-       {
-               largv[com_argc] = argv[com_argc];
-               if (!strcmp ("-safe", argv[com_argc]))
-                       safe = true;
-       }
-
-       if (safe)
-       {
-       // force all the safe-mode switches. Note that we reserved extra space in
-       // case we need to add these, so we don't need an overflow check
-               for (i=0 ; i<NUM_SAFE_ARGVS ; i++)
-               {
-                       largv[com_argc] = safeargvs[i];
-                       com_argc++;
-               }
-       }
+void COM_InitGameType (void)
+{
+       char name[MAX_OSPATH];
+       COM_StripExtension(com_argv[0], name);
+       COM_ToLowerString(name, name);
 
-       largv[com_argc] = argvdummy;
-       com_argv = largv;
+       if (strstr(name, "transfusion"))
+               gamemode = GAME_TRANSFUSION;
+       else if (strstr(name, "nehahra"))
+               gamemode = GAME_NEHAHRA;
+       else if (strstr(name, "hipnotic"))
+               gamemode = GAME_HIPNOTIC;
+       else if (strstr(name, "rogue"))
+               gamemode = GAME_ROGUE;
+       else
+               gamemode = GAME_NORMAL;
 
-#if ZYMOTIC
-       gamemode = GAME_ZYMOTIC;
-#elif FIENDARENA
-       gamemode = GAME_FIENDARENA;
-#elif NEHAHRA
-       gamemode = GAME_NEHAHRA;
-#else
-       if (COM_CheckParm ("-zymotic"))
-               gamemode = GAME_ZYMOTIC;
-       else if (COM_CheckParm ("-fiendarena"))
-               gamemode = GAME_FIENDARENA;
+       if (COM_CheckParm ("-transfusion"))
+               gamemode = GAME_TRANSFUSION;
        else if (COM_CheckParm ("-nehahra"))
                gamemode = GAME_NEHAHRA;
        else if (COM_CheckParm ("-hipnotic"))
                gamemode = GAME_HIPNOTIC;
        else if (COM_CheckParm ("-rogue"))
                gamemode = GAME_ROGUE;
-#endif
+       else if (COM_CheckParm ("-quake"))
+               gamemode = GAME_NORMAL;
+
        switch(gamemode)
        {
        case GAME_NORMAL:
-               gamename = "DarkPlaces";
+               gamename = "DarkPlaces-Quake";
+               gamedirname = "";
                break;
        case GAME_HIPNOTIC:
                gamename = "Darkplaces-Hipnotic";
+               gamedirname = "hipnotic";
                break;
        case GAME_ROGUE:
                gamename = "Darkplaces-Rogue";
+               gamedirname = "rogue";
                break;
        case GAME_NEHAHRA:
                gamename = "DarkPlaces-Nehahra";
+               gamedirname = "nehahra";
                break;
-       case GAME_FIENDARENA:
-               gamename = "FiendArena";
-               break;
-       case GAME_ZYMOTIC:
-               gamename = "Zymotic";
+       case GAME_TRANSFUSION:
+               gamename = "Transfusion";
+               gamedirname = "transfusion";
                break;
        default:
-               Sys_Error("COM_InitArgv: unknown gamemode %i\n", gamemode);
+               Sys_Error("COM_InitGameType: unknown gamemode %i\n", gamemode);
                break;
        }
 }
@@ -1243,17 +927,6 @@ char    *va(char *format, ...)
 }
 
 
-/// just for debugging
-int     memsearch (qbyte *start, int count, int search)
-{
-       int             i;
-
-       for (i=0 ; i<count ; i++)
-               if (start[i] == search)
-                       return i;
-       return -1;
-}
-
 /*
 =============================================================================
 
@@ -1355,8 +1028,9 @@ void    COM_CreatePath (char *path)
 
        for (ofs = path+1 ; *ofs ; ofs++)
        {
-               if (*ofs == '/' || *ofs == '\\' || *ofs == ':')
-               {       // create the directory
+               if (*ofs == '/' || *ofs == '\\')
+               {
+                       // create the directory
                        save = *ofs;
                        *ofs = 0;
                        Sys_mkdir (path);
@@ -1373,7 +1047,7 @@ COM_WriteFile
 The filename will be prefixed by the current game directory
 ============
 */
-void COM_WriteFile (char *filename, void *data, int len)
+qboolean COM_WriteFile (char *filename, void *data, int len)
 {
        int             handle;
        char    name[MAX_OSPATH];
@@ -1386,13 +1060,14 @@ void COM_WriteFile (char *filename, void *data, int len)
        handle = Sys_FileOpenWrite (name);
        if (handle == -1)
        {
-               Sys_Printf ("COM_WriteFile: failed on %s\n", name);
-               return;
+               Con_Printf ("COM_WriteFile: failed on %s\n", name);
+               return false;
        }
 
-       Con_Printf ("COM_WriteFile: %s\n", name);
+       Con_DPrintf ("COM_WriteFile: %s\n", name);
        Sys_FileWrite (handle, data, len);
        Sys_FileClose (handle);
+       return true;
 }
 
 
@@ -1510,11 +1185,6 @@ int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip)
 // search through the path, one element at a time
 //
        search = com_searchpaths;
-//     if (proghack)
-//     {       // gross hack to use quake 1 progs with quake 2 maps
-//             if (!strcmp(filename, "progs.dat"))
-//                     search = search->next;
-//     }
 
        for ( ; search ; search = search->next)
        {
@@ -1536,13 +1206,6 @@ int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip)
                }
                else
                {               
-       // check a file in the directory tree
-//                     if (!static_registered)
-//                     {       // if not a registered version, don't ever go beyond base
-//                             if ( strchr (filename, '/') || strchr (filename,'\\'))
-//                                     continue;
-//                     }
-                       
                        sprintf (netpath, "%s/%s",search->filename, filename);
                        
                        findtime = Sys_FileTime (netpath);
@@ -1563,7 +1226,7 @@ int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip)
 #endif
 
                                cachetime = Sys_FileTime (cachepath);
-                       
+
                                if (cachetime < findtime)
                                        COM_CopyFile (netpath, cachepath);
                                strcpy (netpath, cachepath);
@@ -1664,10 +1327,8 @@ pack_t *COM_LoadPackFile (char *packfile)
        dpackfile_t             *info;
 
        if (Sys_FileOpenRead (packfile, &packhandle) == -1)
-       {
-               //Con_Printf ("Couldn't open %s\n", packfile);
                return NULL;
-       }
+
        Sys_FileRead (packhandle, (void *)&header, sizeof(header));
        if (memcmp(header.id, "PACK", 4))
                Sys_Error ("%s is not a packfile", packfile);
@@ -1720,10 +1381,10 @@ then loads and adds pak1.pak pak2.pak ...
 */
 void COM_AddGameDirectory (char *dir)
 {
-       int                             i;
-       searchpath_t    *search;
-       pack_t                  *pak;
-       char                    pakfile[MAX_OSPATH];
+       stringlist_t *list, *current;
+       searchpath_t *search;
+       pack_t *pak;
+       char pakfile[MAX_OSPATH];
 
        strcpy (com_gamedir, dir);
 
@@ -1735,25 +1396,26 @@ void COM_AddGameDirectory (char *dir)
        search->next = com_searchpaths;
        com_searchpaths = search;
 
-//
-// add any pak files in the format pak0.pak pak1.pak, ...
-//
-       for (i=0 ; ; i++)
+       // add any paks in the directory
+       list = listdirectory(dir);
+       for (current = list;current;current = current->next)
        {
-               sprintf (pakfile, "%s/pak%i.pak", dir, i);
-               pak = COM_LoadPackFile (pakfile);
-               if (!pak)
-                       break;
-               search = Mem_Alloc(pak_mempool, sizeof(searchpath_t));
-               search->pack = pak;
-               search->next = com_searchpaths;
-               com_searchpaths = search;
+               if (matchpattern(current->text, "*.pak"))
+               {
+                       sprintf (pakfile, "%s/%s", dir, current->text);
+                       pak = COM_LoadPackFile (pakfile);
+                       if (pak)
+                       {
+                               search = Mem_Alloc(pak_mempool, sizeof(searchpath_t));
+                               search->pack = pak;
+                               search->next = com_searchpaths;
+                               com_searchpaths = search;
+                       }
+                       else
+                               Con_Printf("unable to load pak \"%s\"\n", pakfile);
+               }
        }
-
-//
-// add the contents of the parms.txt file to the end of the command line
-//
-
+       freedirectory(list);
 }
 
 /*
@@ -1763,90 +1425,40 @@ COM_InitFilesystem
 */
 void COM_InitFilesystem (void)
 {
-       int             i, j;
-       char    basedir[MAX_OSPATH];
-       searchpath_t    *search;
+       int i;
+       searchpath_t *search;
 
-//
-// -basedir <path>
-// Overrides the system supplied base directory (under GAMENAME)
-//
+       strcpy(com_basedir, ".");
+
+       // -basedir <path>
+       // Overrides the system supplied base directory (under GAMENAME)
        i = COM_CheckParm ("-basedir");
        if (i && i < com_argc-1)
-               strcpy (basedir, com_argv[i+1]);
-       else
-               strcpy (basedir, host_parms.basedir);
+               strcpy (com_basedir, com_argv[i+1]);
 
-       j = strlen (basedir);
-
-       if (j > 0)
-       {
-               if ((basedir[j-1] == '\\') || (basedir[j-1] == '/'))
-                       basedir[j-1] = 0;
-       }
-
-#if CACHEENABLE
-//
-// -cachedir <path>
-// Overrides the system supplied cache directory (NULL or /qcache)
-// -cachedir - will disable caching.
-//
-       i = COM_CheckParm ("-cachedir");
-       if (i && i < com_argc-1)
-       {
-               if (com_argv[i+1][0] == '-')
-                       com_cachedir[0] = 0;
-               else
-                       strcpy (com_cachedir, com_argv[i+1]);
-       }
-       else if (host_parms.cachedir)
-               strcpy (com_cachedir, host_parms.cachedir);
-       else
-               com_cachedir[0] = 0;
-#endif
+       i = strlen (com_basedir);
+       if (i > 0 && (com_basedir[i-1] == '\\' || com_basedir[i-1] == '/'))
+               com_basedir[i-1] = 0;
 
 // start up with GAMENAME by default (id1)
-       COM_AddGameDirectory (va("%s/"GAMENAME, basedir) );
-
-       switch(gamemode)
+       COM_AddGameDirectory (va("%s/"GAMENAME, com_basedir));
+       if (gamedirname[0])
        {
-       case GAME_NORMAL:
-               break;
-       case GAME_HIPNOTIC:
-               COM_AddGameDirectory (va("%s/hipnotic", basedir) );
-               break;
-       case GAME_ROGUE:
-               COM_AddGameDirectory (va("%s/rogue", basedir) );
-               break;
-       case GAME_NEHAHRA:
-               COM_AddGameDirectory (va("%s/nehahra", basedir) );
-               break;
-       case GAME_FIENDARENA:
-               COM_AddGameDirectory (va("%s/fiendarena", basedir) );
-               break;
-       case GAME_ZYMOTIC:
-               COM_AddGameDirectory (va("%s/zymotic", basedir) );
-               break;
-       default:
-               Sys_Error("COM_InitFilesystem: unknown gamemode %i\n", gamemode);
-               break;
+               com_modified = true;
+               COM_AddGameDirectory (va("%s/%s", com_basedir, gamedirname));
        }
 
-//
-// -game <gamedir>
-// Adds basedir/gamedir as an override game
-//
+       // -game <gamedir>
+       // Adds basedir/gamedir as an override game
        i = COM_CheckParm ("-game");
        if (i && i < com_argc-1)
        {
                com_modified = true;
-               COM_AddGameDirectory (va("%s/%s", basedir, com_argv[i+1]));
+               COM_AddGameDirectory (va("%s/%s", com_basedir, com_argv[i+1]));
        }
 
-//
-// -path <dir or packfile> [<dir or packfile>] ...
-// Fully specifies the exact search path, overriding the generated one
-//
+       // -path <dir or packfile> [<dir or packfile>] ...
+       // Fully specifies the exact search path, overriding the generated one
        i = COM_CheckParm ("-path");
        if (i)
        {
@@ -1870,9 +1482,6 @@ void COM_InitFilesystem (void)
                        com_searchpaths = search;
                }
        }
-
-//     if (COM_CheckParm ("-proghack"))
-//             proghack = true;
 }
 
 int COM_FileExists(char *filename)
@@ -1929,3 +1538,12 @@ void COM_ToUpperString(char *in, char *out)
                        *out++ = *in++;
        }
 }
+
+int COM_StringBeginsWith(const char *s, const char *match)
+{
+       for (;*s && *match;s++, match++)
+               if (*s != *match)
+                       return false;
+       return true;
+}
+