diff --git a/src/common/utility/findfile.cpp b/src/common/utility/findfile.cpp index 65090cc90..d5da7b027 100644 --- a/src/common/utility/findfile.cpp +++ b/src/common/utility/findfile.cpp @@ -50,7 +50,7 @@ // //========================================================================== -bool D_AddFile(std::vector& wadfiles, const char* file, bool check, int position, FConfigFile* config) +bool D_AddFile(std::vector& wadfiles, const char* file, bool check, int position, FConfigFile* config, bool optional) { if (file == nullptr || *file == '\0') { @@ -127,7 +127,7 @@ bool D_AddFile(std::vector& wadfiles, const char* file, bool check, // //========================================================================== -void D_AddWildFile(std::vector& wadfiles, const char* value, const char *extension, FConfigFile* config) +void D_AddWildFile(std::vector& wadfiles, const char* value, const char *extension, FConfigFile* config, bool optional) { if (value == nullptr || *value == '\0') { @@ -137,7 +137,7 @@ void D_AddWildFile(std::vector& wadfiles, const char* value, const if (wadfile != nullptr) { - D_AddFile(wadfiles, wadfile, true, -1, config); + D_AddFile(wadfiles, wadfile, true, -1, config, optional); } else { @@ -150,7 +150,7 @@ void D_AddWildFile(std::vector& wadfiles, const char* value, const { for(auto& entry : list) { - D_AddFile(wadfiles, entry.FilePath.c_str(), true, -1, config); + D_AddFile(wadfiles, entry.FilePath.c_str(), true, -1, config, optional); } } } @@ -164,7 +164,7 @@ void D_AddWildFile(std::vector& wadfiles, const char* value, const // //========================================================================== -void D_AddConfigFiles(std::vector& wadfiles, const char* section, const char* extension, FConfigFile *config) +void D_AddConfigFiles(std::vector& wadfiles, const char* section, const char* extension, FConfigFile *config, bool optional) { if (config && config->SetSection(section)) { @@ -178,7 +178,7 @@ void D_AddConfigFiles(std::vector& wadfiles, const char* section, c { // D_AddWildFile resets config's position, so remember it config->GetPosition(pos); - D_AddWildFile(wadfiles, ExpandEnvVars(value).GetChars(), extension, config); + D_AddWildFile(wadfiles, ExpandEnvVars(value).GetChars(), extension, config, optional); // Reset config's position to get next wad config->SetPosition(pos); } @@ -194,7 +194,7 @@ void D_AddConfigFiles(std::vector& wadfiles, const char* section, c // //========================================================================== -void D_AddDirectory(std::vector& wadfiles, const char* dir, const char *filespec, FConfigFile* config) +void D_AddDirectory(std::vector& wadfiles, const char* dir, const char *filespec, FConfigFile* config, bool optional) { FileSys::FileList list; if (FileSys::ScanDirectory(list, dir, "*.wad", true)) @@ -203,7 +203,7 @@ void D_AddDirectory(std::vector& wadfiles, const char* dir, const c { if (!entry.isDirectory) { - D_AddFile(wadfiles, entry.FilePath.c_str(), true, -1, config); + D_AddFile(wadfiles, entry.FilePath.c_str(), true, -1, config, optional); } } } diff --git a/src/common/utility/findfile.h b/src/common/utility/findfile.h index fd58ecde5..77e18bc55 100644 --- a/src/common/utility/findfile.h +++ b/src/common/utility/findfile.h @@ -7,8 +7,8 @@ class FConfigFile; -bool D_AddFile(std::vector& wadfiles, const char* file, bool check, int position, FConfigFile* config); -void D_AddWildFile(std::vector& wadfiles, const char* value, const char *extension, FConfigFile* config); -void D_AddConfigFiles(std::vector& wadfiles, const char* section, const char* extension, FConfigFile* config); -void D_AddDirectory(std::vector& wadfiles, const char* dir, const char *filespec, FConfigFile* config); +bool D_AddFile(std::vector& wadfiles, const char* file, bool check, int position, FConfigFile* config, bool optional = false); +void D_AddWildFile(std::vector& wadfiles, const char* value, const char *extension, FConfigFile* config, bool optional = false); +void D_AddConfigFiles(std::vector& wadfiles, const char* section, const char* extension, FConfigFile* config, bool optional = false); +void D_AddDirectory(std::vector& wadfiles, const char* dir, const char *filespec, FConfigFile* config, bool optional = false); const char* BaseFileSearch(const char* file, const char* ext, bool lookfirstinprogdir, FConfigFile* config); diff --git a/src/d_iwad.cpp b/src/d_iwad.cpp index 19a0e4504..6a60c4e90 100644 --- a/src/d_iwad.cpp +++ b/src/d_iwad.cpp @@ -798,7 +798,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char // [SP] Load non-free assets if available. This must be done before the IWAD. int iwadnum = 1; - if (optional_wad && D_AddFile(wadfiles, optional_wad, true, -1, GameConfig)) + if (optional_wad && D_AddFile(wadfiles, optional_wad, true, -1, GameConfig, true)) { iwadnum++; } @@ -824,7 +824,7 @@ int FIWadManager::IdentifyVersion (std::vector&wadfiles, const char if(supportWAD.IsNotEmpty()) { - D_AddFile(wadfiles, supportWAD.GetChars(), true, -1, GameConfig); + D_AddFile(wadfiles, supportWAD.GetChars(), true, -1, GameConfig, true); } } } diff --git a/src/d_main.cpp b/src/d_main.cpp index a5a8dbbcc..3ec3e83ec 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -1788,20 +1788,21 @@ FExecList *D_MultiExec (FArgs *list, FExecList *exec) return exec; } -static void GetCmdLineFiles(std::vector& wadfiles) +static void GetCmdLineFiles(std::vector& wadfiles, bool optional) { FString *args; int i; int argc; - argc = Args->CheckParmList("-file", &args); + argc = optional ? Args->CheckParmList("-optfile", &args) : Args->CheckParmList("-file", &args); assert(wadfiles.size() < INT_MAX); - // [RL0] Check for array size to only add new wads - for (i = int(wadfiles.size()); i < argc; ++i) + // Check for array size to only add new wads, but only to skip over the non-optional + // ones we added earlier. + for (i = optional ? 0 : int(wadfiles.size()); i < argc; ++i) { - D_AddWildFile(wadfiles, args[i].GetChars(), ".wad", GameConfig); + D_AddWildFile(wadfiles, args[i].GetChars(), ".wad", GameConfig, optional); } } @@ -1993,7 +1994,8 @@ static void D_DoomInit() Args->CollectFiles("-bex", ".bex"); Args->CollectFiles("-exec", ".cfg"); Args->CollectFiles("-playdemo", ".lmp"); - Args->CollectFiles("-file", NULL); // anything left goes after -file + Args->CollectFiles("-file", nullptr); // anything left goes after -file + Args->CollectFiles("-optfile", nullptr); gamestate = GS_STARTUP; @@ -2018,19 +2020,19 @@ static void AddAutoloadFiles(const char *autoname, std::vector& all { const char *lightswad = BaseFileSearch ("lights.pk3", NULL, true, GameConfig); if (lightswad) - D_AddFile (allwads, lightswad, true, -1, GameConfig); + D_AddFile (allwads, lightswad, true, -1, GameConfig, true); } if ((GameStartupInfo.LoadBrightmaps == 1 || (GameStartupInfo.LoadBrightmaps != 0 && autoloadbrightmaps)) && !(Args->CheckParm("-nobrightmaps"))) { const char *bmwad = BaseFileSearch ("brightmaps.pk3", NULL, true, GameConfig); if (bmwad) - D_AddFile (allwads, bmwad, true, -1, GameConfig); + D_AddFile (allwads, bmwad, true, -1, GameConfig, true); } if ((GameStartupInfo.LoadWidescreen == 1 || (GameStartupInfo.LoadWidescreen != 0 && autoloadwidescreen)) && !(Args->CheckParm("-nowidescreen"))) { const char *wswad = BaseFileSearch ("game_widescreen_gfx.pk3", NULL, true, GameConfig); if (wswad) - D_AddFile (allwads, wswad, true, -1, GameConfig); + D_AddFile (allwads, wswad, true, -1, GameConfig, true); } } @@ -2046,7 +2048,7 @@ static void AddAutoloadFiles(const char *autoname, std::vector& all // it for something else, so this gets to stay here. const char *wad = BaseFileSearch ("zvox.wad", NULL, false, GameConfig); if (wad) - D_AddFile (allwads, wad, true, -1, GameConfig); + D_AddFile (allwads, wad, true, -1, GameConfig, true); // [RH] Add any .wad files in the skins directory #ifdef __unix__ @@ -2055,7 +2057,7 @@ static void AddAutoloadFiles(const char *autoname, std::vector& all file = progdir; #endif file += "skins"; - D_AddDirectory (allwads, file.GetChars(), "*.wad", GameConfig); + D_AddDirectory (allwads, file.GetChars(), "*.wad", GameConfig, true); #ifdef __unix__ file = NicePath("$HOME/" GAME_DIR "/skins"); @@ -2063,7 +2065,7 @@ static void AddAutoloadFiles(const char *autoname, std::vector& all #endif // Add common (global) wads - D_AddConfigFiles(allwads, "Global.Autoload", "*.wad", GameConfig); + D_AddConfigFiles(allwads, "Global.Autoload", "*.wad", GameConfig, true); ptrdiff_t len; ptrdiff_t lastpos = -1; @@ -2071,7 +2073,7 @@ static void AddAutoloadFiles(const char *autoname, std::vector& all while ((len = LumpFilterIWAD.IndexOf('.', lastpos+1)) > 0) { file = LumpFilterIWAD.Left(len) + ".Autoload"; - D_AddConfigFiles(allwads, file.GetChars(), "*.wad", GameConfig); + D_AddConfigFiles(allwads, file.GetChars(), "*.wad", GameConfig, true); lastpos = len; } } @@ -3790,7 +3792,7 @@ static int D_DoomMain_Internal (void) // the IWAD is known. std::vector pwads; - GetCmdLineFiles(pwads); + GetCmdLineFiles(pwads, false); FString iwad = CheckGameInfo(pwads); // The IWAD selection dialogue does not show in fullscreen so if the @@ -3801,12 +3803,13 @@ static int D_DoomMain_Internal (void) const FIWADInfo *iwad_info = iwad_man->FindIWAD(allwads, iwad.GetChars(), basewad.GetChars(), optionalwad.GetChars()); - GetCmdLineFiles(pwads); // [RL0] Update with files passed on the launcher extra args + GetCmdLineFiles(pwads, false); // [RL0] Update with files passed on the launcher extra args + GetCmdLineFiles(pwads, true); if (!iwad_info) return 0; // user exited the selection popup via cancel button. if ((iwad_info->flags & GI_SHAREWARE) && pwads.size() > 0) { - I_FatalError ("You cannot -file with the shareware version. Register!"); + I_FatalError ("You cannot -file or -optfile with the shareware version. Register!"); } lastIWAD = iwad; @@ -4012,6 +4015,7 @@ UNSAFE_CCMD(debug_restart) Args->RemoveArgs("-bex"); Args->RemoveArgs("-playdemo"); Args->RemoveArgs("-file"); + Args->RemoveArgs("-optfile"); Args->RemoveArgs("-altdeath"); Args->RemoveArgs("-deathmatch"); Args->RemoveArgs("-coop");