]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
fs: save files in the correct place when gamedir(s) are in use
authorbones_was_here <bones_was_here@xonotic.au>
Mon, 5 Feb 2024 22:59:24 +0000 (08:59 +1000)
committerbones_was_here <bones_was_here@xonotic.au>
Tue, 6 Feb 2024 08:06:36 +0000 (18:06 +1000)
As per the description of the `gamedir` command, it's expected that a
gamedir can be added without needing to re-add the primary
(gamedirname1) or secondary/mod (gamedirname2) as the last gamedir just
to ensure that files still get saved there as usual.

Closes https://gitlab.com/xonotic/darkplaces/-/issues/210

Signed-off-by: bones_was_here <bones_was_here@xonotic.au>
fs.c
fs.h

diff --git a/fs.c b/fs.c
index e1b22c46e6c8bce318118b441ae01b9a0e84634e..ad69946f961894f4e474cab6b918beac2f8ef02e 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -1345,13 +1345,14 @@ Sets fs_gamedir, adds the directory to the head of the path,
 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);
@@ -1392,14 +1393,14 @@ static void FS_AddGameDirectory (const char *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);
 }
 
 
@@ -1560,30 +1561,32 @@ void FS_Rescan (void)
 
        // 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)
diff --git a/fs.h b/fs.h
index 7b7b18f9c1a5ec3ecd0f9d15070d93b9446f3b14..30b4487f5706d62cc8f3f78c825c373c4d17c977 100644 (file)
--- a/fs.h
+++ b/fs.h
@@ -38,7 +38,7 @@ typedef int64_t fs_offset_t;
 
 // ------ Variables ------ //
 
-extern char fs_gamedir [MAX_OSPATH];
+extern char fs_gamedir [MAX_OSPATH]; ///< Files will be saved in this gamedir.
 extern char fs_basedir [MAX_OSPATH];
 extern char fs_userdir [MAX_OSPATH];