char filename [MAX_OSPATH];
char shortname [MAX_QPATH];
filedesc_t handle;
- int ignorecase; ///< PK3 ignores case
+ qbool ignorecase; ///< PK3 ignores case
int numfiles;
qbool vpack;
qbool dlcache;
void FS_Ls_f(cmd_state_t *cmd);
void FS_Which_f(cmd_state_t *cmd);
-static searchpath_t *FS_FindFile (const char *name, int* index, qbool quiet);
+static searchpath_t *FS_FindFile (const char *name, int *index, const char **canonicalname, qbool quiet);
static packfile_t* FS_AddFileToPack (const char* name, pack_t* pack,
fs_offset_t offset, fs_offset_t packsize,
fs_offset_t realsize, int flags);
*already_loaded = false;
// then find the real name...
- search = FS_FindFile(pakfile, &index, true);
+ search = FS_FindFile(pakfile, &index, NULL, true);
if(!search || search->pack)
{
Con_Printf("could not find pak \"%s\"\n", pakfile);
then loads and adds pak1.pak pak2.pak ...
================
*/
-static void FS_AddGameDirectory (const char *dir)
+static void FS_AddGameDirectory (const char *dir, qbool set_fs_gamedir)
{
int i;
stringlist_t list;
searchpath_t *search;
- dp_strlcpy (fs_gamedir, dir, sizeof (fs_gamedir));
+ if (set_fs_gamedir)
+ dp_strlcpy (fs_gamedir, dir, sizeof (fs_gamedir));
stringlistinit(&list);
listdirectory(&list, "", dir);
FS_AddGameHierarchy
================
*/
-static void FS_AddGameHierarchy (const char *dir)
+static void FS_AddGameHierarchy (const char *dir, qbool set_fs_gamedir)
{
char vabuf[1024];
// Add the common game directory
- FS_AddGameDirectory (va(vabuf, sizeof(vabuf), "%s%s/", fs_basedir, dir));
+ FS_AddGameDirectory (va(vabuf, sizeof(vabuf), "%s%s/", fs_basedir, dir), set_fs_gamedir);
if (*fs_userdir)
- FS_AddGameDirectory(va(vabuf, sizeof(vabuf), "%s%s/", fs_userdir, dir));
+ FS_AddGameDirectory(va(vabuf, sizeof(vabuf), "%s%s/", fs_userdir, dir), set_fs_gamedir);
}
// add the game-specific paths
// gamedirname1 (typically id1)
- FS_AddGameHierarchy (gamedirname1);
+ FS_AddGameHierarchy (gamedirname1, true);
// update the com_modname (used for server info)
if (gamedirname2 && gamedirname2[0])
dp_strlcpy(com_modname, gamedirname2, sizeof(com_modname));
else
dp_strlcpy(com_modname, gamedirname1, sizeof(com_modname));
- // add the game-specific path, if any
+ // add the secondary game-specific path, if any
// (only used for mission packs and the like, which should set fs_modified)
if (gamedirname2 && gamedirname2[0])
{
fs_modified = true;
- FS_AddGameHierarchy (gamedirname2);
+ FS_AddGameHierarchy (gamedirname2, true);
}
// -game <gamedir>
// Adds basedir/gamedir as an override game
// LadyHavoc: now supports multiple -game directories
// set the com_modname (reported in server info)
+ // bones_was_here: does NOT set fs_gamedir in FS_AddGameHierarchy()
+ // so that we still save files in the right place.
*gamedirbuf = 0;
for (i = 0;i < fs_numgamedirs;i++)
{
fs_modified = true;
- FS_AddGameHierarchy (fs_gamedirs[i]);
+ FS_AddGameHierarchy (fs_gamedirs[i], false);
// update the com_modname (used server info)
dp_strlcpy (com_modname, fs_gamedirs[i], sizeof (com_modname));
if(i)
// unload all sounds so they will be reloaded from the new files as needed
S_UnloadAllSounds_f(cmd_local);
- // restart the video subsystem after the config is executed
- Cbuf_InsertText(cmd_local, "\nloadconfig\nvid_restart\n\n");
+ // reset everything that can be and reload configs
+ Cbuf_InsertText(cmd_local, "\nloadconfig\n");
return true;
}
and the file index in the package if relevant
====================
*/
-static searchpath_t *FS_FindFile (const char *name, int* index, qbool quiet)
+static searchpath_t *FS_FindFile (const char *name, int *index, const char **canonicalname, qbool quiet)
{
searchpath_t *search;
pack_t *pak;
if (index != NULL)
*index = -1;
+ if (canonicalname)
+ *canonicalname = NULL;
return NULL;
}
if (!quiet && developer_extra.integer)
- Con_DPrintf("FS_FindFile: %s in %s\n",
- pak->files[middle].name, pak->filename);
+ Con_DPrintf("FS_FindFile: %s in %s\n", pak->files[middle].name, pak->filename);
if (index != NULL)
*index = middle;
+ if (canonicalname)
+ *canonicalname = pak->files[middle].name;
return search;
}
if (index != NULL)
*index = -1;
+ if (canonicalname)
+ *canonicalname = name;
return search;
}
}
if (index != NULL)
*index = -1;
+ if (canonicalname)
+ *canonicalname = NULL;
return NULL;
}
searchpath_t *search;
int pack_ind;
- search = FS_FindFile (filename, &pack_ind, quiet);
+ search = FS_FindFile (filename, &pack_ind, NULL, quiet);
// Not found?
if (search == NULL)
searchpath_t *search;
char fullpath[MAX_OSPATH];
- search = FS_FindFile (filename, NULL, true);
+ search = FS_FindFile (filename, NULL, NULL, true);
if(!search)
return FS_FILETYPE_NONE;
FS_FileExists
Look for a file in the packages and in the filesystem
+Returns its canonical name (VFS path with correct capitalisation) if found, else NULL.
+If the file is found outside a pak, this will be the same pointer as passed in.
==================
*/
-qbool FS_FileExists (const char *filename)
+const char *FS_FileExists (const char *filename)
{
- return (FS_FindFile (filename, NULL, true) != NULL);
+ const char *canonicalname;
+
+ return FS_FindFile(filename, NULL, &canonicalname, true) ? canonicalname : NULL;
}
return;
}
filename = Cmd_Argv(cmd, 1);
- sp = FS_FindFile(filename, &index, true);
+ sp = FS_FindFile(filename, &index, NULL, true);
if (!sp) {
Con_Printf("%s isn't anywhere\n", filename);
return;
const char *FS_WhichPack(const char *filename)
{
int index;
- searchpath_t *sp = FS_FindFile(filename, &index, true);
+ searchpath_t *sp = FS_FindFile(filename, &index, NULL, true);
if(sp && sp->pack)
return sp->pack->shortname;
else if(sp)