ref: 27f8ea9f5a210f055f443ef34017dd2412feb326
parent: 02f2b37c714aa44d82b7e311e03df39430706e69
author: Simon Howard <fraggle@gmail.com>
date: Wed Dec 3 13:54:36 EST 2008
Centralise the list of IWAD files and use bitmasks to select which mission types are valid. Subversion-branch: /branches/raven-branch Subversion-revision: 1405
--- a/src/d_iwad.c
+++ b/src/d_iwad.c
@@ -39,6 +39,19 @@
#include "w_wad.h"
#include "z_zone.h"
+static iwad_t iwads[] =
+{
+ { "doom2.wad", doom2 },
+ { "plutonia.wad", pack_plut },
+ { "tnt.wad", pack_tnt },
+ { "doom.wad", doom },
+ { "doom1.wad", doom },
+ { "chex.wad", doom },
+ { "heretic.wad", heretic },
+ { "heretic1.wad", heretic },
+ { "hexen.wad", hexen },
+};
+
// Array of locations to search for IWAD files
//
// "128 IWAD search directories should be enough for anybody".
@@ -320,16 +333,20 @@
// Search a directory to try to find an IWAD
// Returns the location of the IWAD if found, otherwise NULL.
-static char *SearchDirectoryForIWAD(char *dir, iwad_t *iwads,
- GameMission_t *mission)
+static char *SearchDirectoryForIWAD(char *dir, int mask, GameMission_t *mission)
{
size_t i;
- for (i=0; iwads[i].name != NULL; ++i)
+ for (i=0; i<arrlen(iwads); ++i)
{
char *filename;
char *iwadname;
+ if ((iwads[i].mission & mask) == 0)
+ {
+ continue;
+ }
+
iwadname = DEH_String(iwads[i].name);
filename = malloc(strlen(dir) + strlen(iwadname) + 3);
@@ -359,17 +376,22 @@
// When given an IWAD with the '-iwad' parameter,
// attempt to identify it by its name.
-static GameMission_t IdentifyIWADByName(char *name, iwad_t *iwads)
+static GameMission_t IdentifyIWADByName(char *name, int mask)
{
size_t i;
GameMission_t mission;
mission = none;
-
- for (i=0; iwads[i].name != NULL; ++i)
+
+ for (i=0; i<arrlen(iwads); ++i)
{
char *iwadname;
+ // Only use supported missions:
+
+ if ((iwads[i].mission & mask) == 0)
+ continue;
+
iwadname = DEH_String(iwads[i].name);
if (strlen(name) < strlen(iwadname))
@@ -390,7 +412,7 @@
//
// Add directories from the list in the DOOMWADPATH environment variable.
-//
+//
static void AddDoomWadPath(void)
{
@@ -564,7 +586,7 @@
// should be executed (notably loading PWADs).
//
-char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission)
+char *D_FindIWAD(int mask, GameMission_t *mission)
{
char *result;
char *iwadfile;
@@ -594,7 +616,7 @@
I_Error("IWAD file '%s' not found!", iwadfile);
}
- *mission = IdentifyIWADByName(result, iwads);
+ *mission = IdentifyIWADByName(result, mask);
}
else
{
@@ -606,34 +628,10 @@
for (i=0; result == NULL && i<num_iwad_dirs; ++i)
{
- result = SearchDirectoryForIWAD(iwad_dirs[i], iwads, mission);
+ result = SearchDirectoryForIWAD(iwad_dirs[i], mask, mission);
}
}
return result;
-}
-
-// Clever hack: Setup can invoke Doom to determine which IWADs are installed.
-// Doom searches install paths and exits with the return code being a
-// bitmask of the installed IWAD files.
-
-void D_FindInstalledIWADs(iwad_t *iwads)
-{
- unsigned int i;
- int result;
-
- BuildIWADDirList();
-
- result = 0;
-
- for (i=0; i<arrlen(iwads); ++i)
- {
- if (D_FindWADByName(iwads[i].name) != NULL)
- {
- result |= 1 << i;
- }
- }
-
- exit(result);
}
--- a/src/d_iwad.h
+++ b/src/d_iwad.h
@@ -29,6 +29,13 @@
#include "d_mode.h"
+#define IWAD_MASK_DOOM ((1 << doom) \
+ | (1 << doom2) \
+ | (1 << pack_tnt) \
+ | (1 << pack_plut))
+#define IWAD_MASK_HERETIC (1 << heretic)
+#define IWAD_MASK_HEXEN (1 << hexen)
+
typedef struct
{
char *name;
@@ -37,8 +44,7 @@
char *D_FindWADByName(char *filename);
char *D_TryFindWADByName(char *filename);
-char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission);
-void D_FindInstalledIWADs(iwad_t *iwads);
+char *D_FindIWAD(int mask, GameMission_t *mission);
#endif
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -591,17 +591,6 @@
D_AdvanceDemo ();
}
-static iwad_t iwads[] =
-{
- {"doom2.wad", doom2},
- {"plutonia.wad", pack_plut},
- {"tnt.wad", pack_tnt},
- {"doom.wad", doom},
- {"doom1.wad", doom},
- {"chex.wad", doom},
- {NULL, none},
-};
-
// Strings for dehacked replacements of the startup banner
//
// These are from the original source: some of them are perhaps
@@ -1061,14 +1050,6 @@
M_FindResponseFile ();
- // Undocumented "search for IWADs" parameter used by the setup
- // tool.
-
- if (M_CheckParm("-findiwads") > 0)
- {
- D_FindInstalledIWADs(iwads);
- }
-
// print banner
I_PrintBanner(PACKAGE_STRING);
@@ -1123,7 +1104,7 @@
DEH_Init();
#endif
- iwadfile = D_FindIWAD(iwads, &gamemission);
+ iwadfile = D_FindIWAD(IWAD_MASK_DOOM, &gamemission);
// None found?
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -455,12 +455,6 @@
#define SHAREWAREWADNAME "heretic1.wad"
-static iwad_t iwads[] = {
- { "heretic.wad", heretic },
- { "heretic1.wad", heretic },
- { NULL, none },
-};
-
char *iwadfile;
char *basedefault = "heretic.cfg";
@@ -880,7 +874,7 @@
printf("W_Init: Init WADfiles.\n");
- iwadfile = D_FindIWAD(iwads, &gamemission);
+ iwadfile = D_FindIWAD(IWAD_MASK_HERETIC, &gamemission);
if (iwadfile == NULL)
{
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -136,11 +136,6 @@
static int pagetic;
static char *pagename;
-static iwad_t iwads[] = {
- { "hexen.wad", hexen },
- { NULL, none },
-};
-
static execOpt_t ExecOptions[] = {
{"-file", ExecOptionFILE, 1, 0},
{"-scripts", ExecOptionSCRIPTS, 1, 0},
@@ -272,7 +267,7 @@
ST_Message("W_Init: Init WADfiles.\n");
- iwadfile = D_FindIWAD(iwads, &gamemission);
+ iwadfile = D_FindIWAD(IWAD_MASK_HEXEN, &gamemission);
if (iwadfile == NULL)
{