foxygit / doom Log in
commit 27f8ea9f5a210f055f443ef34017dd2412feb326
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Wed Dec 3 18:54:36 2008 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Wed Dec 3 18:54:36 2008 +0000

    Centralise the list of IWAD files and use bitmasks to select which
    mission types are valid.

    Subversion-branch: /branches/raven-branch
    Subversion-revision: 1405
---
 src/d_iwad.c         | 66 +++++++++++++++++++++++++---------------------------
 src/d_iwad.h         | 10 ++++++--
 src/doom/d_main.c    | 21 +----------------
 src/heretic/d_main.c |  8 +------
 src/hexen/h2_main.c  |  7 +-----
 5 files changed, 43 insertions(+), 69 deletions(-)

diff --git a/src/d_iwad.c b/src/d_iwad.c
index a67a6d4f..e6ee2cf8 100644
--- 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 @@ static void CheckDOSDefaults(void)
 // 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 @@ static char *SearchDirectoryForIWAD(char *dir, iwad_t *iwads,
 // 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 @@ static GameMission_t IdentifyIWADByName(char *name, iwad_t *iwads)

 //
 // Add directories from the list in the DOOMWADPATH environment variable.
-//
+//

 static void AddDoomWadPath(void)
 {
@@ -564,7 +586,7 @@ char *D_TryFindWADByName(char *filename)
 // 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 @@ char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission)
             I_Error("IWAD file '%s' not found!", iwadfile);
         }

-        *mission = IdentifyIWADByName(result, iwads);
+        *mission = IdentifyIWADByName(result, mask);
     }
     else
     {
@@ -606,34 +628,10 @@ char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission)

         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);
-}
-
diff --git a/src/d_iwad.h b/src/d_iwad.h
index 456f52ac..d55a9660 100644
--- 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 @@ typedef struct

 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

diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 91224e88..c8a91e74 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -591,17 +591,6 @@ void D_StartTitle (void)
     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 @@ void D_DoomMain (void)

     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 @@ void D_DoomMain (void)
     DEH_Init();
 #endif

-    iwadfile = D_FindIWAD(iwads, &gamemission);
+    iwadfile = D_FindIWAD(IWAD_MASK_DOOM, &gamemission);

     // None found?

diff --git a/src/heretic/d_main.c b/src/heretic/d_main.c
index b8edd430..bba09e65 100644
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -455,12 +455,6 @@ void D_CheckRecordFrom(void)

 #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 @@ void D_DoomMain(void)

     printf("W_Init: Init WADfiles.\n");

-    iwadfile = D_FindIWAD(iwads, &gamemission);
+    iwadfile = D_FindIWAD(IWAD_MASK_HERETIC, &gamemission);

     if (iwadfile == NULL)
     {
diff --git a/src/hexen/h2_main.c b/src/hexen/h2_main.c
index f7bc665e..72e323c5 100644
--- a/src/hexen/h2_main.c
+++ b/src/hexen/h2_main.c
@@ -136,11 +136,6 @@ static int demosequence;
 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 @@ void D_DoomMain(void)

     ST_Message("W_Init: Init WADfiles.\n");

-    iwadfile = D_FindIWAD(iwads, &gamemission);
+    iwadfile = D_FindIWAD(IWAD_MASK_HEXEN, &gamemission);

     if (iwadfile == NULL)
     {