foxygit / doom Log in
commit 8cae6e48779beb3dc8e95a5c32b422b2504b5722
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Tue Sep 30 22:50:24 2008 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Tue Sep 30 22:50:24 2008 +0000

    Move d_iwad.c into common code and update Heretic to use it on startup
    to locate the IWAD file.

    Subversion-branch: /branches/raven-branch
    Subversion-revision: 1308
---
 src/Makefile.am         |   1 +
 src/{doom => }/d_iwad.c | 310 +++---------------------------------------------
 src/{doom => }/d_iwad.h |  15 ++-
 src/d_mode.h            |   2 +
 src/doom/Makefile.am    |   1 -
 src/doom/d_main.c       | 238 ++++++++++++++++++++++++++++++++++++-
 src/heretic/d_main.c    | 149 ++++++++---------------
 7 files changed, 310 insertions(+), 406 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index c931d27f..a7746831 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,6 +32,7 @@ d_event.c            d_event.h             \
                      doomkeys.h            \
                      doomfeatures.h        \
                      doomtype.h            \
+d_iwad.c             d_iwad.h              \
 d_mode.c             d_mode.h              \
                      d_ticcmd.h            \
 i_cdmus.c            i_cdmus.h             \
diff --git a/src/doom/d_iwad.c b/src/d_iwad.c
similarity index 64%
rename from src/doom/d_iwad.c
rename to src/d_iwad.c
index dcf2651a..6f7bff70 100644
--- a/src/doom/d_iwad.c
+++ b/src/d_iwad.c
@@ -29,10 +29,9 @@
 #include <ctype.h>
 #include <string.h>

-#include "deh_main.h"
+#include "deh_str.h"
 #include "doomkeys.h"
-#include "doomdef.h"
-#include "doomstat.h"
+#include "d_iwad.h"
 #include "i_system.h"
 #include "m_argv.h"
 #include "m_config.h"
@@ -316,37 +315,15 @@ static void CheckDOSDefaults(void)

 #endif

-static struct
-{
-    char *name;
-    GameMission_t mission;
-} iwads[] = {
-    {"doom2.wad",    doom2},
-    {"plutonia.wad", pack_plut},
-    {"tnt.wad",      pack_tnt},
-    {"doom.wad",     doom},
-    {"doom1.wad",    doom},
-    {"chex.wad",     doom},
-};
-
-// Hack for chex quest mode
-
-static void CheckChex(char *iwad_name)
-{
-    if (!strcmp(iwad_name, "chex.wad"))
-    {
-        gameversion = exe_chex;
-    }
-}
-
 // Search a directory to try to find an IWAD
 // Returns the location of the IWAD if found, otherwise NULL.

-static char *SearchDirectoryForIWAD(char *dir)
+static char *SearchDirectoryForIWAD(char *dir, iwad_t *iwads,
+                                    GameMission_t *mission)
 {
     size_t i;

-    for (i=0; i<arrlen(iwads); ++i)
+    for (i=0; iwads[i].name != NULL; ++i)
     {
         char *filename;
         char *iwadname;
@@ -366,8 +343,7 @@ static char *SearchDirectoryForIWAD(char *dir)

         if (M_FileExists(filename))
         {
-            CheckChex(iwads[i].name);
-            gamemission = iwads[i].mission;
+            *mission = iwads[i].mission;

             return filename;
         }
@@ -381,13 +357,14 @@ static char *SearchDirectoryForIWAD(char *dir)
 // When given an IWAD with the '-iwad' parameter,
 // attempt to identify it by its name.

-static void IdentifyIWADByName(char *name)
+static GameMission_t IdentifyIWADByName(char *name, iwad_t *iwads)
 {
     size_t i;
+    GameMission_t mission;

-    gamemission = none;
+    mission = none;

-    for (i=0; i<arrlen(iwads); ++i)
+    for (i=0; iwads[i].name != NULL; ++i)
     {
         char *iwadname;

@@ -401,11 +378,12 @@ static void IdentifyIWADByName(char *name)
         if (!strcasecmp(name + strlen(name) - strlen(iwadname),
                         iwadname))
         {
-            CheckChex(iwads[i].name);
-            gamemission = iwads[i].mission;
+            mission = iwads[i].mission;
             break;
         }
     }
+
+    return mission;
 }

 //
@@ -584,7 +562,7 @@ char *D_TryFindWADByName(char *filename)
 // should be executed (notably loading PWADs).
 //

-char *D_FindIWAD(void)
+char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission)
 {
     char *result;
     char *iwadfile;
@@ -614,7 +592,7 @@ char *D_FindIWAD(void)
             I_Error("IWAD file '%s' not found!", iwadfile);
         }

-        IdentifyIWADByName(result);
+        *mission = IdentifyIWADByName(result, iwads);
     }
     else
     {
@@ -626,272 +604,18 @@ char *D_FindIWAD(void)

         for (i=0; result == NULL && i<num_iwad_dirs; ++i)
         {
-            result = SearchDirectoryForIWAD(iwad_dirs[i]);
+            result = SearchDirectoryForIWAD(iwad_dirs[i], iwads, mission);
         }
     }

     return result;
 }

-//
-// Get the IWAD name used for savegames.
-//
-
-static char *SaveGameIWADName(void)
-{
-    size_t i;
-
-    // Chex quest hack
-
-    if (gameversion == exe_chex)
-    {
-        return "chex.wad";
-    }
-
-    // Find what subdirectory to use for savegames
-    //
-    // They should be stored in something like
-    //    ~/.chocolate-doom/savegames/doom.wad/
-    //
-    // The directory depends on the IWAD, so that savegames for
-    // different IWADs are kept separate.
-    //
-    // Note that we match on gamemission rather than on IWAD name.
-    // This ensures that doom1.wad and doom.wad saves are stored
-    // in the same place.
-
-    for (i=0; i<arrlen(iwads); ++i)
-    {
-        if (gamemission == iwads[i].mission)
-        {
-            return iwads[i].name;
-        }
-    }
-
-    return NULL;
-}
-//
-// SetSaveGameDir
-//
-// Chooses the directory used to store saved games.
-//
-
-void D_SetSaveGameDir(void)
-{
-    char *iwad_name;
-
-    if (!strcmp(configdir, ""))
-    {
-        // Use the current directory, just like configdir.
-
-        savegamedir = strdup("");
-    }
-    else
-    {
-        // Directory for savegames
-
-        iwad_name = SaveGameIWADName();
-
-        if (iwad_name == NULL)
-        {
-            iwad_name = "unknown.wad";
-        }
-
-        savegamedir = Z_Malloc(strlen(configdir) + 30, PU_STATIC, 0);
-        sprintf(savegamedir, "%ssavegames%c%s%c", configdir,
-                             DIR_SEPARATOR, iwad_name, DIR_SEPARATOR);
-
-        M_MakeDirectory(savegamedir);
-    }
-}
-
-// Strings for dehacked replacements of the startup banner
-//
-// These are from the original source: some of them are perhaps
-// not used in any dehacked patches
-
-static char *banners[] =
-{
-    // doom1.wad
-    "                            "
-    "DOOM Shareware Startup v%i.%i"
-    "                           ",
-    // doom.wad
-    "                            "
-    "DOOM Registered Startup v%i.%i"
-    "                           ",
-    // Registered DOOM uses this
-    "                          "
-    "DOOM System Startup v%i.%i"
-    "                          ",
-    // doom.wad (Ultimate DOOM)
-    "                         "
-    "The Ultimate DOOM Startup v%i.%i"
-    "                        ",
-    // doom2.wad
-    "                         "
-    "DOOM 2: Hell on Earth v%i.%i"
-    "                           ",
-    // tnt.wad
-    "                     "
-    "DOOM 2: TNT - Evilution v%i.%i"
-    "                           ",
-    // plutonia.wad
-    "                   "
-    "DOOM 2: Plutonia Experiment v%i.%i"
-    "                           ",
-};
-
-//
-// Get game name: if the startup banner has been replaced, use that.
-// Otherwise, use the name given
-//
-
-static char *GetGameName(char *gamename)
-{
-    size_t i;
-    char *deh_sub;
-
-    for (i=0; i<arrlen(banners); ++i)
-    {
-        // Has the banner been replaced?
-
-        deh_sub = DEH_String(banners[i]);
-
-        if (deh_sub != banners[i])
-        {
-            // Has been replaced
-            // We need to expand via printf to include the Doom version
-            // number
-            // We also need to cut off spaces to get the basic name
-
-            gamename = Z_Malloc(strlen(deh_sub) + 10, PU_STATIC, 0);
-            sprintf(gamename, deh_sub, DOOM_VERSION / 100, DOOM_VERSION % 100);
-
-            while (gamename[0] != '\0' && isspace(gamename[0]))
-                strcpy(gamename, gamename+1);
-
-            while (gamename[0] != '\0' && isspace(gamename[strlen(gamename)-1]))
-                gamename[strlen(gamename) - 1] = '\0';
-
-            return gamename;
-        }
-    }
-
-    return gamename;
-}
-
-
-//
-// Find out what version of Doom is playing.
-//
-
-void D_IdentifyVersion(void)
-{
-    // gamemission is set up by the D_FindIWAD function.  But if
-    // we specify '-iwad', we have to identify using
-    // IdentifyIWADByName.  However, if the iwad does not match
-    // any known IWAD name, we may have a dilemma.  Try to
-    // identify by its contents.
-
-    if (gamemission == none)
-    {
-        unsigned int i;
-
-        for (i=0; i<numlumps; ++i)
-        {
-            if (!strncasecmp(lumpinfo[i].name, "MAP01", 8))
-            {
-                gamemission = doom2;
-                break;
-            }
-            else if (!strncasecmp(lumpinfo[i].name, "E1M1", 8))
-            {
-                gamemission = doom;
-                break;
-            }
-        }
-
-        if (gamemission == none)
-        {
-            // Still no idea.  I don't think this is going to work.
-
-            I_Error("Unknown or invalid IWAD file.");
-        }
-    }
-
-    // Make sure gamemode is set up correctly
-
-    if (gamemission == doom)
-    {
-        // Doom 1.  But which version?
-
-        if (W_CheckNumForName("E4M1") > 0)
-        {
-            // Ultimate Doom
-
-            gamemode = retail;
-        }
-        else if (W_CheckNumForName("E3M1") > 0)
-        {
-            gamemode = registered;
-        }
-        else
-        {
-            gamemode = shareware;
-        }
-    }
-    else
-    {
-        // Doom 2 of some kind.
-
-        gamemode = commercial;
-    }
-}
-
-// Set the gamedescription string
-
-void D_SetGameDescription(void)
-{
-    gamedescription = "Unknown";
-
-    if (gamemission == doom)
-    {
-        // Doom 1.  But which version?
-
-        if (gamemode == retail)
-        {
-            // Ultimate Doom
-
-            gamedescription = GetGameName("The Ultimate DOOM");
-        }
-        else if (gamemode == registered)
-        {
-            gamedescription = GetGameName("DOOM Registered");
-        }
-        else if (gamemode == shareware)
-        {
-            gamedescription = GetGameName("DOOM Shareware");
-        }
-    }
-    else
-    {
-        // Doom 2 of some kind.  But which mission?
-
-        if (gamemission == doom2)
-            gamedescription = GetGameName("DOOM 2: Hell on Earth");
-        else if (gamemission == pack_plut)
-            gamedescription = GetGameName("DOOM 2: Plutonia Experiment");
-        else if (gamemission == pack_tnt)
-            gamedescription = GetGameName("DOOM 2: TNT - Evilution");
-    }
-}
-
 // 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(void)
+void D_FindInstalledIWADs(iwad_t *iwads)
 {
     unsigned int i;
     int result;
diff --git a/src/doom/d_iwad.h b/src/d_iwad.h
similarity index 85%
rename from src/doom/d_iwad.h
rename to src/d_iwad.h
index 281d3467..456f52ac 100644
--- a/src/doom/d_iwad.h
+++ b/src/d_iwad.h
@@ -27,13 +27,18 @@
 #ifndef __D_IWAD__
 #define __D_IWAD__

+#include "d_mode.h"
+
+typedef struct
+{
+    char *name;
+    GameMission_t mission;
+} iwad_t;
+
 char *D_FindWADByName(char *filename);
 char *D_TryFindWADByName(char *filename);
-char *D_FindIWAD(void);
-void D_SetSaveGameDir(void);
-void D_IdentifyVersion(void);
-void D_SetGameDescription(void);
-void D_FindInstalledIWADs(void);
+char *D_FindIWAD(iwad_t *iwads, GameMission_t *mission);
+void D_FindInstalledIWADs(iwad_t *iwads);

 #endif

diff --git a/src/d_mode.h b/src/d_mode.h
index b3295ffe..b7214737 100644
--- a/src/d_mode.h
+++ b/src/d_mode.h
@@ -28,6 +28,8 @@
 #ifndef __D_MODE__
 #define __D_MODE__

+#include "doomtype.h"
+
 // The "mission" controls what game we are playing.

 typedef enum
diff --git a/src/doom/Makefile.am b/src/doom/Makefile.am
index 5982721f..7b7073b6 100644
--- a/src/doom/Makefile.am
+++ b/src/doom/Makefile.am
@@ -6,7 +6,6 @@ SOURCE_FILES=                   \
 am_map.c           am_map.h     \
                    d_englsh.h   \
 d_items.c          d_items.h    \
-d_iwad.c           d_iwad.h     \
 d_main.c           d_main.h     \
 d_net.c            d_net.h      \
                    doomdata.h   \
diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 1a778730..419e871c 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -586,8 +586,234 @@ 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
+// not used in any dehacked patches
+
+static char *banners[] =
+{
+    // doom1.wad
+    "                            "
+    "DOOM Shareware Startup v%i.%i"
+    "                           ",
+    // doom.wad
+    "                            "
+    "DOOM Registered Startup v%i.%i"
+    "                           ",
+    // Registered DOOM uses this
+    "                          "
+    "DOOM System Startup v%i.%i"
+    "                          ",
+    // doom.wad (Ultimate DOOM)
+    "                         "
+    "The Ultimate DOOM Startup v%i.%i"
+    "                        ",
+    // doom2.wad
+    "                         "
+    "DOOM 2: Hell on Earth v%i.%i"
+    "                           ",
+    // tnt.wad
+    "                     "
+    "DOOM 2: TNT - Evilution v%i.%i"
+    "                           ",
+    // plutonia.wad
+    "                   "
+    "DOOM 2: Plutonia Experiment v%i.%i"
+    "                           ",
+};
+
+//
+// Get game name: if the startup banner has been replaced, use that.
+// Otherwise, use the name given
+//
+
+static char *GetGameName(char *gamename)
+{
+    size_t i;
+    char *deh_sub;
+
+    for (i=0; i<arrlen(banners); ++i)
+    {
+        // Has the banner been replaced?
+
+        deh_sub = DEH_String(banners[i]);
+
+        if (deh_sub != banners[i])
+        {
+            // Has been replaced
+            // We need to expand via printf to include the Doom version
+            // number
+            // We also need to cut off spaces to get the basic name
+
+            gamename = Z_Malloc(strlen(deh_sub) + 10, PU_STATIC, 0);
+            sprintf(gamename, deh_sub, DOOM_VERSION / 100, DOOM_VERSION % 100);
+
+            while (gamename[0] != '\0' && isspace(gamename[0]))
+                strcpy(gamename, gamename+1);
+
+            while (gamename[0] != '\0' && isspace(gamename[strlen(gamename)-1]))
+                gamename[strlen(gamename) - 1] = '\0';
+
+            return gamename;
+        }
+    }
+
+    return gamename;
+}
+
+//
+// Find out what version of Doom is playing.
+//
+
+void D_IdentifyVersion(void)
+{
+    // gamemission is set up by the D_FindIWAD function.  But if
+    // we specify '-iwad', we have to identify using
+    // IdentifyIWADByName.  However, if the iwad does not match
+    // any known IWAD name, we may have a dilemma.  Try to
+    // identify by its contents.
+
+    if (gamemission == none)
+    {
+        unsigned int i;
+
+        for (i=0; i<numlumps; ++i)
+        {
+            if (!strncasecmp(lumpinfo[i].name, "MAP01", 8))
+            {
+                gamemission = doom2;
+                break;
+            }
+            else if (!strncasecmp(lumpinfo[i].name, "E1M1", 8))
+            {
+                gamemission = doom;
+                break;
+            }
+        }
+
+        if (gamemission == none)
+        {
+            // Still no idea.  I don't think this is going to work.
+
+            I_Error("Unknown or invalid IWAD file.");
+        }
+    }
+
+    // Make sure gamemode is set up correctly
+
+    if (gamemission == doom)
+    {
+        // Doom 1.  But which version?

+        if (W_CheckNumForName("E4M1") > 0)
+        {
+            // Ultimate Doom
+
+            gamemode = retail;
+        }
+        else if (W_CheckNumForName("E3M1") > 0)
+        {
+            gamemode = registered;
+        }
+        else
+        {
+            gamemode = shareware;
+        }
+    }
+    else
+    {
+        // Doom 2 of some kind.
+
+        gamemode = commercial;
+    }
+}
+
+// Set the gamedescription string
+
+void D_SetGameDescription(void)
+{
+    gamedescription = "Unknown";
+
+    if (gamemission == doom)
+    {
+        // Doom 1.  But which version?
+
+        if (gamemode == retail)
+        {
+            // Ultimate Doom
+
+            gamedescription = GetGameName("The Ultimate DOOM");
+        }
+        else if (gamemode == registered)
+        {
+            gamedescription = GetGameName("DOOM Registered");
+        }
+        else if (gamemode == shareware)
+        {
+            gamedescription = GetGameName("DOOM Shareware");
+        }
+    }
+    else
+    {
+        // Doom 2 of some kind.  But which mission?
+
+        if (gamemission == doom2)
+            gamedescription = GetGameName("DOOM 2: Hell on Earth");
+        else if (gamemission == pack_plut)
+            gamedescription = GetGameName("DOOM 2: Plutonia Experiment");
+        else if (gamemission == pack_tnt)
+            gamedescription = GetGameName("DOOM 2: TNT - Evilution");
+    }
+}
+
+static void SetSaveGameDir(char *iwad_filename)
+{
+    char *sep;
+    char *basefile;
+
+    // Extract the base filename
+
+    sep = strrchr(iwad_filename, DIR_SEPARATOR);
+
+    if (sep == NULL)
+    {
+        basefile = iwad_filename;
+    }
+    else
+    {
+        basefile = sep + 1;
+    }
+
+    // eg. ~/.chocolate-doom/savegames/doom2.wad/
+
+    savegamedir = malloc(strlen(configdir) + strlen(basefile) + 10);
+    sprintf(savegamedir, "%ssavegames%c%s%c",
+            configdir, DIR_SEPARATOR, basefile, DIR_SEPARATOR);
+}
+
+// Check if the IWAD file is the Chex Quest IWAD.
+// Returns true if this is chex.wad.
+
+static boolean CheckChex(char *iwadname)
+{
+    char *chex_iwadname = "chex.wad";

+    return (strlen(iwadname) > strlen(chex_iwadname)
+     && !strcasecmp(iwadname + strlen(iwadname) - strlen(chex_iwadname),
+                    chex_iwadname));
+}

 //      print title for every printed line
 char            title[128];
@@ -711,9 +937,11 @@ static void InitGameVersion(void)
     {
         // Determine automatically

-        if (gameversion == exe_chex)
+        if (CheckChex(iwadfile))
         {
-            // Already determined
+            // chex.exe - identified by iwad filename
+
+            gameversion = exe_chex;
         }
         else if (gamemode == shareware || gamemode == registered)
         {
@@ -833,7 +1061,7 @@ void D_DoomMain (void)

     if (M_CheckParm("-findiwads") > 0)
     {
-        D_FindInstalledIWADs();
+        D_FindInstalledIWADs(iwads);
     }

     // print banner
@@ -890,7 +1118,7 @@ void D_DoomMain (void)
     DEH_Init();
 #endif

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

     // None found?

@@ -1259,7 +1487,7 @@ void D_DoomMain (void)
     InitGameVersion();
     LoadChexDeh();
     D_SetGameDescription();
-    D_SetSaveGameDir();
+    SetSaveGameDir(iwadfile);

     // Check for -file in shareware
     if (modifiedgame)
diff --git a/src/heretic/d_main.c b/src/heretic/d_main.c
index 19944c21..669d7b3d 100644
--- a/src/heretic/d_main.c
+++ b/src/heretic/d_main.c
@@ -29,6 +29,7 @@
 #include "config.h"
 #include "ct_chat.h"
 #include "doomdef.h"
+#include "d_iwad.h"
 #include "i_system.h"
 #include "i_video.h"
 #include "m_argv.h"
@@ -434,8 +435,6 @@ void D_CheckRecordFrom(void)
 ===============
 */

-#define MAXWADFILES 20
-
 // MAPDIR should be defined as the directory that holds development maps
 // for the -wart # # command

@@ -443,14 +442,15 @@ void D_CheckRecordFrom(void)

 #define SHAREWAREWADNAME "heretic1.wad"

-char *wadfiles[MAXWADFILES] = {
-    "heretic.wad",
+static iwad_t iwads[] = {
+    { "heretic.wad",        heretic },
+    { "heretic1.wad",       heretic },
+    { NULL,                 none },
 };

-char *basedefault = "heretic.cfg";
+char *iwadfile;

-char exrnwads[80];
-char exrnwads2[80];
+char *basedefault = "heretic.cfg";

 void wadprintf(void)
 {
@@ -468,41 +468,15 @@ void wadprintf(void)
 #endif
 }

-void D_AddFile(char *file)
+boolean D_AddFile(char *file)
 {
-    int numwadfiles;
-    char *new;
-//      char text[256];
-
-    for (numwadfiles = 0; wadfiles[numwadfiles]; numwadfiles++);
-    new = malloc(strlen(file) + 1);
-    strcpy(new, file);
-    if (strlen(exrnwads) + strlen(file) < 78)
-    {
-        if (strlen(exrnwads))
-        {
-            strcat(exrnwads, ", ");
-        }
-        else
-        {
-            strcpy(exrnwads, "External Wadfiles: ");
-        }
-        strcat(exrnwads, file);
-    }
-    else if (strlen(exrnwads2) + strlen(file) < 79)
-    {
-        if (strlen(exrnwads2))
-        {
-            strcat(exrnwads2, ", ");
-        }
-        else
-        {
-            strcpy(exrnwads2, "     ");
-            strcat(exrnwads, ",");
-        }
-        strcat(exrnwads2, file);
-    }
-    wadfiles[numwadfiles] = new;
+    wad_file_t *handle;
+
+    printf("  adding %s\n", file);
+
+    handle = W_AddFile(file);
+
+    return handle != NULL;
 }

 //==========================================================
@@ -789,13 +763,8 @@ static void D_Endoom(void)

 void D_DoomMain(void)
 {
-    int i;
     int p;
-    int e;
-    int m;
     char file[256];
-    FILE *fp;
-    boolean devMap;

     I_PrintBanner(PACKAGE_STRING);

@@ -813,17 +782,6 @@ void D_DoomMain(void)
     startmap = 1;
     autostart = false;

-    // wadfiles[0] is a char * to the main wad
-    fp = fopen(wadfiles[0], "rb");
-    if (fp)
-    {
-        fclose(fp);
-    }
-    else
-    {                           // Change to look for shareware wad
-        wadfiles[0] = SHAREWAREWADNAME;
-    }
-
     // Check for -CDROM
     cdrom = false;
 #ifdef __WATCOMC__
@@ -834,48 +792,6 @@ void D_DoomMain(void)
     }
 #endif

-    // -FILE [filename] [filename] ...
-    // Add files to the wad list.
-    p = M_CheckParm("-file");
-    if (p)
-    {                           // the parms after p are wadfile/lump names, until end of parms
-        // or another - preceded parm
-        while (++p != myargc && myargv[p][0] != '-')
-        {
-            D_AddFile(myargv[p]);
-        }
-    }
-
-    // -DEVMAP <episode> <map>
-    // Adds a map wad from the development directory to the wad list,
-    // and sets the start episode and the start map.
-    devMap = false;
-    p = M_CheckParm("-devmap");
-    if (p && p < myargc - 2)
-    {
-        e = myargv[p + 1][0];
-        m = myargv[p + 2][0];
-        sprintf(file, MAPDIR "E%cM%c.wad", e, m);
-        D_AddFile(file);
-        printf("DEVMAP: Episode %c, Map %c.\n", e, m);
-        startepisode = e - '0';
-        startmap = m - '0';
-        autostart = true;
-        devMap = true;
-    }
-
-    p = M_CheckParm("-playdemo");
-    if (!p)
-    {
-        p = M_CheckParm("-timedemo");
-    }
-    if (p && p < myargc - 1)
-    {
-        sprintf(file, "%s.lmp", myargv[p + 1]);
-        D_AddFile(file);
-        printf("Playing demo %s.lmp.\n", myargv[p + 1]);
-    }
-
 //
 // get skill / episode / map from parms
 //
@@ -928,9 +844,38 @@ void D_DoomMain(void)

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

-    for (i=0; wadfiles[i] != NULL; ++i)
+    iwadfile = D_FindIWAD(iwads, &gamemission);
+
+    if (iwadfile == NULL)
     {
-        W_AddFile(wadfiles[i]);
+        I_Error("Game mode indeterminate. No IWAD was found. Try specifying\n"
+                "one with the '-iwad' command line parameter.");
+    }
+
+    D_AddFile(iwadfile);
+
+    // -FILE [filename] [filename] ...
+    // Add files to the wad list.
+    p = M_CheckParm("-file");
+    if (p)
+    {                           // the parms after p are wadfile/lump names, until end of parms
+        // or another - preceded parm
+        while (++p != myargc && myargv[p][0] != '-')
+        {
+            D_AddFile(myargv[p]);
+        }
+    }
+
+    p = M_CheckParm("-playdemo");
+    if (!p)
+    {
+        p = M_CheckParm("-timedemo");
+    }
+    if (p && p < myargc - 1)
+    {
+        sprintf(file, "%s.lmp", myargv[p + 1]);
+        D_AddFile(file);
+        printf("Playing demo %s.lmp.\n", myargv[p + 1]);
     }

     if (W_CheckNumForName("E2M1") == -1)
@@ -1064,7 +1009,7 @@ void D_DoomMain(void)
     }

     // Check valid episode and map
-    if ((autostart || netgame) && (devMap == false))
+    if (autostart || netgame)
     {
         if (M_ValidEpisodeMap(startepisode, startmap) == false)
         {