Added -optfile argument

Allows specify optional files from the commandline (note: this currently isn't hooked up to the filesystem proper for marking, this is purely for the file parsing until then).
This commit is contained in:
Boondorl 2025-07-22 23:11:56 -04:00 committed by Ricardo Luís Vaz Silva
commit f0283a7773
4 changed files with 34 additions and 30 deletions

View file

@ -50,7 +50,7 @@
//
//==========================================================================
bool D_AddFile(std::vector<std::string>& wadfiles, const char* file, bool check, int position, FConfigFile* config)
bool D_AddFile(std::vector<std::string>& 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<std::string>& wadfiles, const char* file, bool check,
//
//==========================================================================
void D_AddWildFile(std::vector<std::string>& wadfiles, const char* value, const char *extension, FConfigFile* config)
void D_AddWildFile(std::vector<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& wadfiles, const char* value, const
//
//==========================================================================
void D_AddConfigFiles(std::vector<std::string>& wadfiles, const char* section, const char* extension, FConfigFile *config)
void D_AddConfigFiles(std::vector<std::string>& 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<std::string>& 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<std::string>& wadfiles, const char* section, c
//
//==========================================================================
void D_AddDirectory(std::vector<std::string>& wadfiles, const char* dir, const char *filespec, FConfigFile* config)
void D_AddDirectory(std::vector<std::string>& 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<std::string>& 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);
}
}
}

View file

@ -7,8 +7,8 @@
class FConfigFile;
bool D_AddFile(std::vector<std::string>& wadfiles, const char* file, bool check, int position, FConfigFile* config);
void D_AddWildFile(std::vector<std::string>& wadfiles, const char* value, const char *extension, FConfigFile* config);
void D_AddConfigFiles(std::vector<std::string>& wadfiles, const char* section, const char* extension, FConfigFile* config);
void D_AddDirectory(std::vector<std::string>& wadfiles, const char* dir, const char *filespec, FConfigFile* config);
bool D_AddFile(std::vector<std::string>& wadfiles, const char* file, bool check, int position, FConfigFile* config, bool optional = false);
void D_AddWildFile(std::vector<std::string>& wadfiles, const char* value, const char *extension, FConfigFile* config, bool optional = false);
void D_AddConfigFiles(std::vector<std::string>& wadfiles, const char* section, const char* extension, FConfigFile* config, bool optional = false);
void D_AddDirectory(std::vector<std::string>& 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);

View file

@ -798,7 +798,7 @@ int FIWadManager::IdentifyVersion (std::vector<std::string>&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<std::string>&wadfiles, const char
if(supportWAD.IsNotEmpty())
{
D_AddFile(wadfiles, supportWAD.GetChars(), true, -1, GameConfig);
D_AddFile(wadfiles, supportWAD.GetChars(), true, -1, GameConfig, true);
}
}
}

View file

@ -1788,20 +1788,21 @@ FExecList *D_MultiExec (FArgs *list, FExecList *exec)
return exec;
}
static void GetCmdLineFiles(std::vector<std::string>& wadfiles)
static void GetCmdLineFiles(std::vector<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& 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<std::string>& 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<std::string> 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");