]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
fix compile problem on win32
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 8086a34b988ddc9947e6712f3ab84b3d75b40c7b..043bf3171a144624f14780401b90719666b43170 100644 (file)
--- a/fs.c
+++ b/fs.c
                Boston, MA  02111-1307, USA
 */
 
-#include <limits.h>
-#include <fcntl.h>
-
 #ifdef WIN32
 # include <direct.h>
 # include <io.h>
 # include <shlobj.h>
-#else
+#endif
+
+// on *x, we MUST include "quakedef.h" before anything that may include IO
+// functions to get _FILE_OFFSET_BITS
+#include "quakedef.h"
+
+#ifdef __APPLE__
+// include SDL for IPHONEOS code
+# include <TargetConditionals.h>
+# if TARGET_OS_IPHONE
+#  include <SDL.h>
+# endif
+#endif
+
+#include <limits.h>
+#include <fcntl.h>
+
+#ifndef WIN32
 # include <pwd.h>
 # include <sys/stat.h>
 # include <unistd.h>
 #endif
 
-#include "quakedef.h"
-
 #include "fs.h"
 #include "wad.h"
 
@@ -628,9 +640,9 @@ int PK3_BuildFileList (pack_t *pack, const pk3_endOfCentralDir_t *eocd)
                                        flags = PACKFILE_FLAG_DEFLATED;
                                else
                                        flags = 0;
-                               offset = BuffLittleLong (&ptr[42]) + eocd->prepended_garbage;
-                               packsize = BuffLittleLong (&ptr[20]);
-                               realsize = BuffLittleLong (&ptr[24]);
+                               offset = (unsigned int)(BuffLittleLong (&ptr[42]) + eocd->prepended_garbage);
+                               packsize = (unsigned int)BuffLittleLong (&ptr[20]);
+                               realsize = (unsigned int)BuffLittleLong (&ptr[24]);
 
                                switch(ptr[5]) // C_VERSION_MADE_BY_1
                                {
@@ -669,7 +681,7 @@ FS_LoadPackPK3
 Create a package entry associated with a PK3 file
 ====================
 */
-pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle)
+pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle, qboolean silent)
 {
        pk3_endOfCentralDir_t eocd;
        pack_t *pack;
@@ -677,7 +689,8 @@ pack_t *FS_LoadPackPK3FromFD (const char *packfile, int packhandle)
 
        if (! PK3_GetEndOfCentralDir (packfile, packhandle, &eocd))
        {
-               Con_Printf ("%s is not a PK3 file\n", packfile);
+               if(!silent)
+                       Con_Printf ("%s is not a PK3 file\n", packfile);
                close(packhandle);
                return NULL;
        }
@@ -731,7 +744,7 @@ pack_t *FS_LoadPackPK3 (const char *packfile)
 #endif
        if (packhandle < 0)
                return NULL;
-       return FS_LoadPackPK3FromFD(packfile, packhandle);
+       return FS_LoadPackPK3FromFD(packfile, packhandle, false);
 }
 
 
@@ -956,8 +969,8 @@ pack_t *FS_LoadPackPAK (const char *packfile)
        // parse the directory
        for (i = 0;i < numpackfiles;i++)
        {
-               fs_offset_t offset = LittleLong (info[i].filepos);
-               fs_offset_t size = LittleLong (info[i].filelen);
+               fs_offset_t offset = (unsigned int)LittleLong (info[i].filepos);
+               fs_offset_t size = (unsigned int)LittleLong (info[i].filelen);
 
                FS_AddFileToPack (info[i].name, pack, offset, size, size, PACKFILE_FLAG_TRUEOFFS);
        }
@@ -1300,10 +1313,17 @@ void FS_Rescan (void)
 {
        int i;
        qboolean fs_modified = false;
+       qboolean reset = false;
        char gamedirbuf[MAX_INPUTLINE];
 
+       if (fs_searchpaths)
+               reset = true;
        FS_ClearSearchPath();
 
+       // automatically activate gamemode for the gamedirs specified
+       if (reset)
+               COM_ChangeGameTypeForGameDirs();
+
        // add the game-specific paths
        // gamedirname1 (typically id1)
        FS_AddGameHierarchy (gamedirname1);
@@ -1354,18 +1374,31 @@ void FS_Rescan (void)
                unlink (va("%s/qconsole.log", fs_gamedir));
 
        // look for the pop.lmp file and set registered to true if it is found
-       if ((gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE) && !FS_FileExists("gfx/pop.lmp"))
+       if (FS_FileExists("gfx/pop.lmp"))
+               Cvar_Set ("registered", "1");
+       switch(gamemode)
        {
-               if (fs_modified)
-                       Con_Print("Playing shareware version, with modification.\nwarning: most mods require full quake data.\n");
+       case GAME_NORMAL:
+       case GAME_HIPNOTIC:
+       case GAME_ROGUE:
+               if (!registered.integer)
+               {
+                       if (fs_modified)
+                               Con_Print("Playing shareware version, with modification.\nwarning: most mods require full quake data.\n");
+                       else
+                               Con_Print("Playing shareware version.\n");
+               }
                else
-                       Con_Print("Playing shareware version.\n");
-       }
-       else
-       {
-               Cvar_Set ("registered", "1");
-               if (gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE)
                        Con_Print("Playing registered version.\n");
+               break;
+       case GAME_STEELSTORM:
+               if (registered.integer)
+                       Con_Print("Playing registered version.\n");
+               else
+                       Con_Print("Playing shareware version.\n");
+               break;
+       default:
+               break;
        }
 
        // unload all wads so that future queries will return the new data
@@ -1384,6 +1417,8 @@ FS_ChangeGameDirs
 */
 extern void Host_SaveConfig (void);
 extern void Host_LoadConfig_f (void);
+extern qboolean vid_opened;
+extern void VID_Stop(void);
 qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean complain, qboolean failmissing)
 {
        int i;
@@ -1432,14 +1467,21 @@ qboolean FS_ChangeGameDirs(int numgamedirs, char gamedirs[][MAX_QPATH], qboolean
        // reinitialize filesystem to detect the new paks
        FS_Rescan();
 
-       // exec the new config
-       Host_LoadConfig_f();
+       if (cls.demoplayback)
+       {
+               CL_Disconnect_f();
+               cls.demonum = 0;
+       }
 
        // unload all sounds so they will be reloaded from the new files as needed
        S_UnloadAllSounds_f();
 
-       // reinitialize renderer (this reloads hud/console background/etc)
-       R_Modules_Restart();
+       // close down the video subsystem, it will start up again when the config finishes...
+       VID_Stop();
+       vid_opened = false;
+
+       // restart the video subsystem after the config is executed
+       Cbuf_InsertText("\nloadconfig\nvid_restart\n\n");
 
        return true;
 }
@@ -1487,7 +1529,6 @@ void FS_GameDir_f (void)
        FS_ChangeGameDirs(numgamedirs, gamedirs, true, true);
 }
 
-static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking);
 static const char *FS_SysCheckGameDir(const char *gamedir)
 {
        static char buf[8192];
@@ -1614,7 +1655,7 @@ void FS_Init_SelfPack (void)
        fs_mempool = Mem_AllocPool("file management", 0, NULL);
        if(com_selffd >= 0)
        {
-               fs_selfpack = FS_LoadPackPK3FromFD(com_argv[0], com_selffd);
+               fs_selfpack = FS_LoadPackPK3FromFD(com_argv[0], com_selffd, true);
                if(fs_selfpack)
                {
                        char *buf, *q;
@@ -1670,7 +1711,9 @@ void FS_Init (void)
        size_t homedirlen;
 #endif
 #endif
+#ifndef __IPHONEOS__
        char *homedir;
+#endif
 
 #ifdef WIN32
        const char* dllnames [] =
@@ -1682,6 +1725,15 @@ void FS_Init (void)
        // don't care for the result; if it fails, %USERPROFILE% will be used instead
 #endif
 
+       *fs_basedir = 0;
+       *fs_userdir = 0;
+       *fs_gamedir = 0;
+
+#ifdef __IPHONEOS__
+       // fs_basedir is "" by default, to utilize this you can simply add your gamedir to the Resources in xcode
+       // fs_userdir stores configurations to the Documents folder of the app
+       strlcpy(fs_userdir, "../Documents/", sizeof(fs_userdir));
+#else
        // Add the personal game directory
        if((i = COM_CheckParm("-userdir")) && i < com_argc - 1)
        {
@@ -1768,6 +1820,7 @@ void FS_Init (void)
                fs_basedir[split - com_argv[0]] = 0;
        }
 #endif
+#endif
 #endif
 
        // -basedir <path>
@@ -1915,7 +1968,7 @@ FS_SysOpen
 Internal function used to create a qfile_t and open the relevant non-packed file on disk
 ====================
 */
-static qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking)
+qfile_t* FS_SysOpen (const char* filepath, const char* mode, qboolean nonblocking)
 {
        qfile_t* file;
 
@@ -1977,8 +2030,8 @@ qfile_t *FS_OpenPackedFile (pack_t* pack, int pack_ind)
        // the dup() call to avoid having to close the dup_handle on error here
        if (lseek (pack->handle, pfile->offset, SEEK_SET) == -1)
        {
-               Con_Printf ("FS_OpenPackedFile: can't lseek to %s in %s (offset: %d)\n",
-                                       pfile->name, pack->filename, (int) pfile->offset);
+               Con_Printf ("FS_OpenPackedFile: can't lseek to %s in %s (offset: %08x%08x)\n",
+                                       pfile->name, pack->filename, (unsigned int)(pfile->offset >> 32), (unsigned int)(pfile->offset));
                return NULL;
        }