]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - fs.c
reduced uninitialized data size by 13MB by moving some temporary arrays
[xonotic/darkplaces.git] / fs.c
diff --git a/fs.c b/fs.c
index 0c6901b3823836002769d861e6bab239c75a3bc2..74329aaf779185b2c82ce6e165fa21144e357592 100644 (file)
--- a/fs.c
+++ b/fs.c
@@ -40,6 +40,7 @@
 #endif
 
 #include "fs.h"
+#include "wad.h"
 
 // Win32 requires us to add O_BINARY, but the other OSes don't have it
 #ifndef O_BINARY
@@ -278,6 +279,7 @@ int fs_numgamedirs = 0;
 char fs_gamedirs[MAX_GAMEDIRS][MAX_QPATH];
 
 cvar_t scr_screenshot_name = {0, "scr_screenshot_name","dp", "prefix name for saved screenshots (changes based on -game commandline, as well as which game mode is running)"};
+cvar_t fs_empty_files_in_pack_mark_deletions = {0, "fs_empty_files_in_pack_mark_deletions", "0", "if enabled, empty files in a pak/pk3 count as not existing but cancel the search in further packs, effectively allowing patch pak/pk3 files to 'delete' files"};
 
 
 /*
@@ -1156,6 +1158,9 @@ void FS_Rescan (void)
                if (gamemode == GAME_NORMAL || gamemode == GAME_HIPNOTIC || gamemode == GAME_ROGUE)
                        Con_Print("Playing registered version.\n");
        }
+
+       // unload all wads so that future queries will return the new data
+       W_UnloadAll();
 }
 
 void FS_Rescan_f(void)
@@ -1379,6 +1384,7 @@ void FS_Init (void)
 void FS_Init_Commands(void)
 {
        Cvar_RegisterVariable (&scr_screenshot_name);
+       Cvar_RegisterVariable (&fs_empty_files_in_pack_mark_deletions);
 
        Cmd_AddCommand ("gamedir", FS_GameDir_f, "changes active gamedir list (can take multiple arguments), not including base directory (example usage: gamedir ctf)");
        Cmd_AddCommand ("fs_rescan", FS_Rescan_f, "rescans filesystem for new pack archives and any other changes");
@@ -1672,6 +1678,17 @@ static searchpath_t *FS_FindFile (const char *name, int* index, qboolean quiet)
                                // Found it
                                if (!diff)
                                {
+                                       if (fs_empty_files_in_pack_mark_deletions.integer && pak->files[middle].realsize == 0)
+                                       {
+                                               // yes, but the first one is empty so we treat it as not being there
+                                               if (!quiet && developer.integer >= 10)
+                                                       Con_Printf("FS_FindFile: %s is marked as deleted\n", name);
+
+                                               if (index != NULL)
+                                                       *index = -1;
+                                               return NULL;
+                                       }
+
                                        if (!quiet && developer.integer >= 10)
                                                Con_Printf("FS_FindFile: %s in %s\n",
                                                                        pak->files[middle].name, pak->filename);