X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=fs.c;h=8d505e8b3604ce2664d668054b553926a05150c6;hb=8f3d7bb7498218801cecdf4024c30988e0770352;hp=a2f057c9b5aca4b1d803ca7d1cd49f140ec40217;hpb=c3edd749ac26c6322eafa8303e592df3c32ffd25;p=xonotic%2Fdarkplaces.git diff --git a/fs.c b/fs.c index a2f057c9..8d505e8b 100644 --- a/fs.c +++ b/fs.c @@ -22,7 +22,13 @@ Boston, MA 02111-1307, USA */ -#include "quakedef.h" +#ifdef __APPLE__ +// include SDL for IPHONEOS code +# include +# if TARGET_OS_IPHONE +# include +# endif +#endif #include #include @@ -37,6 +43,8 @@ # include #endif +#include "quakedef.h" + #include "fs.h" #include "wad.h" @@ -628,9 +636,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 +677,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 +685,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 +740,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 +965,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); } @@ -1283,7 +1292,7 @@ static void FS_AddSelfPack(void) if(fs_selfpack) { searchpath_t *search; - search = Mem_Alloc(fs_mempool, sizeof(searchpath_t)); + search = (searchpath_t *)Mem_Alloc(fs_mempool, sizeof(searchpath_t)); search->next = fs_searchpaths; search->pack = fs_selfpack; fs_searchpaths = search; @@ -1300,10 +1309,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 +1370,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 +1413,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 +1463,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 +1525,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 +1651,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 +1707,9 @@ void FS_Init (void) size_t homedirlen; #endif #endif +#ifndef __IPHONEOS__ char *homedir; +#endif #ifdef WIN32 const char* dllnames [] = @@ -1682,6 +1721,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 +1816,7 @@ void FS_Init (void) fs_basedir[split - com_argv[0]] = 0; } #endif +#endif #endif // -basedir @@ -1915,7 +1964,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 +2026,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; }