mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-01-18 15:42:34 +00:00
- replaced wadlist_t with an array of FStrings and added a list parameter to
everything that eventually calls D_AddFile. Also create the list of files loaded on the command line separately to allow further checks on them. SVN r2072 (trunk)
This commit is contained in:
parent
bf7ed6258b
commit
370eff9014
7 changed files with 93 additions and 86 deletions
|
@ -1,4 +1,7 @@
|
|||
January 1, 2010 (Changes by Graf Zahl)
|
||||
- replaced wadlist_t with an array of FStrings and added a list parameter to
|
||||
everything that eventually calls D_AddFile. Also create the list of files
|
||||
loaded on the command line separately to allow further checks on them.
|
||||
- fixed: The node builder did not check if all segs could be split properly.
|
||||
Also removed some fudging that tried to work around this case but produced
|
||||
a broken BSP tree on other maps.
|
||||
|
|
|
@ -1376,6 +1376,7 @@ void FConsoleAlias::SafeDelete ()
|
|||
|
||||
static BYTE PullinBad = 2;
|
||||
static const char *PullinFile;
|
||||
extern TArray<FString> allwads;
|
||||
|
||||
int C_ExecFile (const char *file, bool usePullin)
|
||||
{
|
||||
|
@ -1492,7 +1493,7 @@ CCMD (pullin)
|
|||
FixPathSeperator (path);
|
||||
}
|
||||
}
|
||||
D_AddFile (path);
|
||||
D_AddFile (allwads, path);
|
||||
if (path != argv[i])
|
||||
{
|
||||
delete[] path;
|
||||
|
|
|
@ -484,7 +484,7 @@ static int CheckIWAD (const char *doomwaddir, WadStuff *wads)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
static EIWADType IdentifyVersion (const char *zdoom_wad)
|
||||
static EIWADType IdentifyVersion (TArray<FString> &wadfiles, const char *zdoom_wad)
|
||||
{
|
||||
WadStuff wads[countof(IWADNames)];
|
||||
size_t foundwads[NUM_IWAD_TYPES] = { 0 };
|
||||
|
@ -630,14 +630,14 @@ static EIWADType IdentifyVersion (const char *zdoom_wad)
|
|||
exit (0);
|
||||
|
||||
// zdoom.pk3 must always be the first file loaded and the IWAD second.
|
||||
D_AddFile (zdoom_wad);
|
||||
D_AddFile (wadfiles, zdoom_wad);
|
||||
|
||||
if (wads[pickwad].Type == IWAD_HexenDK)
|
||||
{ // load hexen.wad before loading hexdd.wad
|
||||
D_AddFile (wads[foundwads[IWAD_Hexen]-1].Path);
|
||||
D_AddFile (wadfiles, wads[foundwads[IWAD_Hexen]-1].Path);
|
||||
}
|
||||
|
||||
D_AddFile (wads[pickwad].Path);
|
||||
D_AddFile (wadfiles, wads[pickwad].Path);
|
||||
|
||||
if (wads[pickwad].Type == IWAD_Strife)
|
||||
{ // Try to load voices.wad along with strife1.wad
|
||||
|
@ -653,16 +653,16 @@ static EIWADType IdentifyVersion (const char *zdoom_wad)
|
|||
path = FString (wads[pickwad].Path.GetChars(), lastslash + 1);
|
||||
}
|
||||
path += "voices.wad";
|
||||
D_AddFile (path);
|
||||
D_AddFile (wadfiles, path);
|
||||
}
|
||||
|
||||
return wads[pickwad].Type;
|
||||
}
|
||||
|
||||
|
||||
const IWADInfo *D_FindIWAD(const char *basewad)
|
||||
const IWADInfo *D_FindIWAD(TArray<FString> &wadfiles, const char *basewad)
|
||||
{
|
||||
EIWADType iwadType = IdentifyVersion(basewad);
|
||||
EIWADType iwadType = IdentifyVersion(wadfiles, basewad);
|
||||
gameiwad = iwadType;
|
||||
const IWADInfo *iwad_info = &IWADInfos[iwadType];
|
||||
I_SetIWADInfo(iwad_info);
|
||||
|
|
133
src/d_main.cpp
133
src/d_main.cpp
|
@ -118,7 +118,7 @@ extern void R_ExecuteSetViewSize ();
|
|||
extern void G_NewInit ();
|
||||
extern void SetupPlayerClasses ();
|
||||
extern bool CheckCheatmode ();
|
||||
extern const IWADInfo *D_FindIWAD(const char *basewad);
|
||||
const IWADInfo *D_FindIWAD(TArray<FString> &wadfiles, const char *basewad);
|
||||
|
||||
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
|
||||
|
||||
|
@ -182,7 +182,7 @@ CVAR (Int, wipetype, 1, CVAR_ARCHIVE);
|
|||
CVAR (Int, snd_drawoutput, 0, 0);
|
||||
|
||||
bool DrawFSHUD; // [RH] Draw fullscreen HUD?
|
||||
wadlist_t *wadfiles; // [RH] remove limit on # of loaded wads
|
||||
TArray<FString> allwads;
|
||||
bool devparm; // started game with -devparm
|
||||
const char *D_DrawIcon; // [RH] Patch name of icon to draw on next refresh
|
||||
int NoWipe; // [RH] Allow wipe? (Needs to be set each time)
|
||||
|
@ -204,7 +204,6 @@ cycle_t FrameCycles;
|
|||
|
||||
// PRIVATE DATA DEFINITIONS ------------------------------------------------
|
||||
|
||||
static wadlist_t **wadtail = &wadfiles;
|
||||
static int demosequence;
|
||||
static int pagetic;
|
||||
|
||||
|
@ -1242,7 +1241,7 @@ CCMD (endgame)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_AddFile (const char *file, bool check)
|
||||
void D_AddFile (TArray<FString> &wadfiles, const char *file, bool check)
|
||||
{
|
||||
if (file == NULL)
|
||||
{
|
||||
|
@ -1259,12 +1258,10 @@ void D_AddFile (const char *file, bool check)
|
|||
}
|
||||
file = f;
|
||||
}
|
||||
wadlist_t *wad = (wadlist_t *)M_Malloc (sizeof(*wad) + strlen(file));
|
||||
|
||||
*wadtail = wad;
|
||||
wad->next = NULL;
|
||||
strcpy (wad->name, file);
|
||||
wadtail = &wad->next;
|
||||
FString f = file;
|
||||
FixPathSeperator(f);
|
||||
wadfiles.Push(f);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
@ -1273,13 +1270,13 @@ void D_AddFile (const char *file, bool check)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_AddWildFile (const char *value)
|
||||
void D_AddWildFile (TArray<FString> &wadfiles, const char *value)
|
||||
{
|
||||
const char *wadfile = BaseFileSearch (value, ".wad");
|
||||
|
||||
if (wadfile != NULL)
|
||||
{
|
||||
D_AddFile (wadfile);
|
||||
D_AddFile (wadfiles, wadfile);
|
||||
}
|
||||
else
|
||||
{ // Try pattern matching
|
||||
|
@ -1309,12 +1306,12 @@ void D_AddWildFile (const char *value)
|
|||
{
|
||||
if (sep == NULL)
|
||||
{
|
||||
D_AddFile (I_FindName (&findstate));
|
||||
D_AddFile (wadfiles, I_FindName (&findstate));
|
||||
}
|
||||
else
|
||||
{
|
||||
strcpy (sep+1, I_FindName (&findstate));
|
||||
D_AddFile (path);
|
||||
D_AddFile (wadfiles, path);
|
||||
}
|
||||
}
|
||||
} while (I_FindNext (handle, &findstate) == 0);
|
||||
|
@ -1331,7 +1328,7 @@ void D_AddWildFile (const char *value)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void D_AddConfigWads (const char *section)
|
||||
void D_AddConfigWads (TArray<FString> &wadfiles, const char *section)
|
||||
{
|
||||
if (GameConfig->SetSection (section))
|
||||
{
|
||||
|
@ -1345,7 +1342,7 @@ void D_AddConfigWads (const char *section)
|
|||
{
|
||||
// D_AddWildFile resets GameConfig's position, so remember it
|
||||
GameConfig->GetPosition (pos);
|
||||
D_AddWildFile (value);
|
||||
D_AddWildFile (wadfiles, value);
|
||||
// Reset GameConfig's position to get next wad
|
||||
GameConfig->SetPosition (pos);
|
||||
}
|
||||
|
@ -1361,7 +1358,7 @@ void D_AddConfigWads (const char *section)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
static void D_AddDirectory (const char *dir)
|
||||
static void D_AddDirectory (TArray<FString> &wadfiles, const char *dir)
|
||||
{
|
||||
char curdir[PATH_MAX];
|
||||
|
||||
|
@ -1391,7 +1388,7 @@ static void D_AddDirectory (const char *dir)
|
|||
if (!(I_FindAttr (&findstate) & FA_DIREC))
|
||||
{
|
||||
strcpy (skindir + stuffstart, I_FindName (&findstate));
|
||||
D_AddFile (skindir);
|
||||
D_AddFile (wadfiles, skindir);
|
||||
}
|
||||
} while (I_FindNext (handle, &findstate) == 0);
|
||||
I_FindClose (handle);
|
||||
|
@ -1584,6 +1581,53 @@ void D_MultiExec (DArgs *list, bool usePullin)
|
|||
}
|
||||
}
|
||||
|
||||
static void GetCmdLineFiles(TArray<FString> &wadfiles)
|
||||
{
|
||||
DArgs *files = Args->GatherFiles ("-file", ".wad", true);
|
||||
DArgs *files1 = Args->GatherFiles (NULL, ".zip", false);
|
||||
DArgs *files2 = Args->GatherFiles (NULL, ".pk3", false);
|
||||
DArgs *files3 = Args->GatherFiles (NULL, ".txt", false);
|
||||
if (files->NumArgs() > 0 || files1->NumArgs() > 0 || files2->NumArgs() > 0 || files3->NumArgs() > 0)
|
||||
{
|
||||
// Check for -file in shareware
|
||||
if (gameinfo.flags & GI_SHAREWARE)
|
||||
{
|
||||
I_FatalError ("You cannot -file with the shareware version. Register!");
|
||||
}
|
||||
|
||||
// the files gathered are wadfile/lump names
|
||||
for (int i = 0; i < files->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (wadfiles, files->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files1->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (wadfiles, files1->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files2->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (wadfiles, files2->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files3->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (wadfiles, files3->GetArg (i));
|
||||
}
|
||||
}
|
||||
files->Destroy();
|
||||
files1->Destroy();
|
||||
files2->Destroy();
|
||||
files3->Destroy();
|
||||
}
|
||||
|
||||
static void CopyFiles(TArray<FString> &to, TArray<FString> &from)
|
||||
{
|
||||
unsigned int ndx = to.Reserve(from.Size());
|
||||
for(unsigned i=0;i<from.Size(); i++)
|
||||
{
|
||||
to[ndx+i] = from[i];
|
||||
}
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// D_DoomMain
|
||||
|
@ -1596,6 +1640,7 @@ void D_DoomMain (void)
|
|||
char *v;
|
||||
const char *wad;
|
||||
DArgs *execFiles;
|
||||
TArray<FString> pwads;
|
||||
|
||||
// Set the FPU precision to 53 significant bits. This is the default
|
||||
// for Visual C++, but not for GCC, so some slight math variances
|
||||
|
@ -1640,7 +1685,7 @@ void D_DoomMain (void)
|
|||
// Load zdoom.pk3 alone so that we can get access to the internal gameinfos before
|
||||
// the IWAD is known.
|
||||
|
||||
const IWADInfo *iwad_info = D_FindIWAD(wad);
|
||||
const IWADInfo *iwad_info = D_FindIWAD(allwads, wad);
|
||||
gameinfo.gametype = iwad_info->gametype;
|
||||
gameinfo.flags = iwad_info->flags;
|
||||
|
||||
|
@ -1657,7 +1702,7 @@ void D_DoomMain (void)
|
|||
// it for something else, so this gets to stay here.
|
||||
wad = BaseFileSearch ("zvox.wad", NULL);
|
||||
if (wad)
|
||||
D_AddFile (wad);
|
||||
D_AddFile (allwads, wad);
|
||||
|
||||
// [RH] Add any .wad files in the skins directory
|
||||
#ifdef unix
|
||||
|
@ -1666,27 +1711,27 @@ void D_DoomMain (void)
|
|||
file = progdir;
|
||||
#endif
|
||||
file += "skins";
|
||||
D_AddDirectory (file);
|
||||
D_AddDirectory (allwads, file);
|
||||
|
||||
#ifdef unix
|
||||
file = NicePath("~/" GAME_DIR "/skins");
|
||||
D_AddDirectory (file);
|
||||
D_AddDirectory (allwads, file);
|
||||
#endif
|
||||
|
||||
// Add common (global) wads
|
||||
D_AddConfigWads ("Global.Autoload");
|
||||
D_AddConfigWads (allwads, "Global.Autoload");
|
||||
|
||||
// Add game-specific wads
|
||||
file = GameNames[gameinfo.gametype];
|
||||
file += ".Autoload";
|
||||
D_AddConfigWads (file);
|
||||
D_AddConfigWads (allwads, file);
|
||||
|
||||
// Add IWAD-specific wads
|
||||
if (iwad_info->Autoname != NULL)
|
||||
{
|
||||
file = iwad_info->Autoname;
|
||||
file += ".Autoload";
|
||||
D_AddConfigWads(file);
|
||||
D_AddConfigWads(allwads, file);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1703,43 +1748,13 @@ void D_DoomMain (void)
|
|||
|
||||
C_ExecCmdLineParams (); // [RH] do all +set commands on the command line
|
||||
|
||||
DArgs *files = Args->GatherFiles ("-file", ".wad", true);
|
||||
DArgs *files1 = Args->GatherFiles (NULL, ".zip", false);
|
||||
DArgs *files2 = Args->GatherFiles (NULL, ".pk3", false);
|
||||
DArgs *files3 = Args->GatherFiles (NULL, ".txt", false);
|
||||
if (files->NumArgs() > 0 || files1->NumArgs() > 0 || files2->NumArgs() > 0 || files3->NumArgs() > 0)
|
||||
{
|
||||
// Check for -file in shareware
|
||||
if (gameinfo.flags & GI_SHAREWARE)
|
||||
{
|
||||
I_FatalError ("You cannot -file with the shareware version. Register!");
|
||||
}
|
||||
GetCmdLineFiles(pwads);
|
||||
|
||||
// the files gathered are wadfile/lump names
|
||||
for (int i = 0; i < files->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (files->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files1->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (files1->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files2->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (files2->GetArg (i));
|
||||
}
|
||||
for (int i = 0; i < files3->NumArgs(); i++)
|
||||
{
|
||||
D_AddWildFile (files3->GetArg (i));
|
||||
}
|
||||
}
|
||||
files->Destroy();
|
||||
files1->Destroy();
|
||||
files2->Destroy();
|
||||
files3->Destroy();
|
||||
CopyFiles(allwads, pwads);
|
||||
|
||||
Printf ("W_Init: Init WADfiles.\n");
|
||||
Wads.InitMultipleFiles (&wadfiles);
|
||||
Wads.InitMultipleFiles (allwads);
|
||||
allwads.Clear();
|
||||
|
||||
// [RH] Initialize localizable strings.
|
||||
GStrings.LoadStrings (false);
|
||||
|
@ -2043,7 +2058,7 @@ void D_DoomMain (void)
|
|||
|
||||
V_Init2();
|
||||
|
||||
files = Args->GatherFiles ("-playdemo", ".lmp", false);
|
||||
DArgs *files = Args->GatherFiles ("-playdemo", ".lmp", false);
|
||||
if (files->NumArgs() > 0)
|
||||
{
|
||||
singledemo = true; // quit after one demo
|
||||
|
|
|
@ -49,7 +49,7 @@ void D_PageTicker (void);
|
|||
void D_PageDrawer (void);
|
||||
void D_AdvanceDemo (void);
|
||||
void D_StartTitle (void);
|
||||
void D_AddFile (const char *file, bool check = true);
|
||||
void D_AddFile (TArray<FString> &wadfiles, const char *file, bool check = true);
|
||||
|
||||
|
||||
// [RH] Set this to something to draw an icon during the next screen refresh.
|
||||
|
|
|
@ -160,7 +160,7 @@ void FWadCollection::DeleteAll ()
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void FWadCollection::InitMultipleFiles (wadlist_t **filenames)
|
||||
void FWadCollection::InitMultipleFiles (TArray<FString> &filenames)
|
||||
{
|
||||
int numfiles;
|
||||
|
||||
|
@ -168,13 +168,10 @@ void FWadCollection::InitMultipleFiles (wadlist_t **filenames)
|
|||
DeleteAll();
|
||||
numfiles = 0;
|
||||
|
||||
while (*filenames)
|
||||
for(unsigned i=0;i<filenames.Size(); i++)
|
||||
{
|
||||
wadlist_t *next = (*filenames)->next;
|
||||
int baselump = NumLumps;
|
||||
AddFile ((*filenames)->name);
|
||||
M_Free (*filenames);
|
||||
*filenames = next;
|
||||
AddFile (filenames[i]);
|
||||
}
|
||||
|
||||
NumLumps = LumpInfo.Size();
|
||||
|
@ -222,7 +219,7 @@ int FWadCollection::AddExternalFile(const char *filename)
|
|||
// [RH] Removed reload hack
|
||||
//==========================================================================
|
||||
|
||||
void FWadCollection::AddFile (char *filename, FileReader *wadinfo)
|
||||
void FWadCollection::AddFile (const char *filename, FileReader *wadinfo)
|
||||
{
|
||||
int startlump;
|
||||
bool isdir = false;
|
||||
|
@ -252,7 +249,6 @@ void FWadCollection::AddFile (char *filename, FileReader *wadinfo)
|
|||
return;
|
||||
}
|
||||
}
|
||||
FixPathSeperator(filename);
|
||||
}
|
||||
|
||||
Printf (" adding %s", filename);
|
||||
|
|
12
src/w_wad.h
12
src/w_wad.h
|
@ -49,14 +49,6 @@ struct wadlump_t
|
|||
#define PWAD_ID MAKE_ID('P','W','A','D')
|
||||
|
||||
|
||||
// [RH] Remove limit on number of WAD files
|
||||
struct wadlist_t
|
||||
{
|
||||
wadlist_t *next;
|
||||
char name[1]; // +size of string
|
||||
};
|
||||
extern wadlist_t *wadfiles;
|
||||
|
||||
// [RH] Namespaces from BOOM.
|
||||
typedef enum {
|
||||
ns_global = 0,
|
||||
|
@ -153,8 +145,8 @@ public:
|
|||
// The wadnum for the IWAD
|
||||
enum { IWAD_FILENUM = 1 };
|
||||
|
||||
void InitMultipleFiles (wadlist_t **filenames);
|
||||
void AddFile (char *filename, FileReader *wadinfo = NULL);
|
||||
void InitMultipleFiles (TArray<FString> &filenames);
|
||||
void AddFile (const char *filename, FileReader *wadinfo = NULL);
|
||||
int CheckIfWadLoaded (const char *name);
|
||||
|
||||
const char *GetWadName (int wadnum) const;
|
||||
|
|
Loading…
Reference in a new issue