foxygit / doom Log in
commit d73a64228a6502ce68e1c9fd1cc5197863a50c7e
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Sun Mar 16 02:23:14 2014 -0400
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Sun Mar 16 02:23:14 2014 -0400

    doom: Add -dehlump parameter to load DEHACKED lumps.

    Lots of otherwise Vanilla-compatible WADs contain DEHACKED lumps.
    Allow these to be loaded by adding a -dehlump command line parameter.
    Thanks to Fabian Greffrath for the suggestion (fixes #349).
---
 src/deh_main.c    | 27 +++++++++++++++++++--------
 src/deh_main.h    |  4 ++--
 src/doom/d_main.c | 27 ++++++++++++++++++++++++++-
 3 files changed, 47 insertions(+), 11 deletions(-)

diff --git a/src/deh_main.c b/src/deh_main.c
index 4bb3e383..20858f32 100644
--- a/src/deh_main.c
+++ b/src/deh_main.c
@@ -348,16 +348,20 @@ int DEH_LoadFile(char *filename)
 }

 // Load dehacked file from WAD lump.
+// If allow_long is set, allow long strings and cheats just for this lump.

-int DEH_LoadLump(int lumpnum)
+int DEH_LoadLump(int lumpnum, boolean allow_long)
 {
     deh_context_t *context;
+    boolean long_strings, long_cheats;

-    // If it's in a lump, it's probably designed for a modern source port,
-    // so allow it to do long string and cheat replacements.
-
-    deh_allow_long_strings = true;
-    deh_allow_long_cheats = true;
+    if (allow_long)
+    {
+        long_strings = deh_allow_long_strings;
+        long_cheats = deh_allow_long_cheats;
+        deh_allow_long_strings = true;
+        deh_allow_long_cheats = true;
+    }

     context = DEH_OpenLump(lumpnum);

@@ -371,10 +375,17 @@ int DEH_LoadLump(int lumpnum)

     DEH_CloseFile(context);

+    // Restore old value of long flags.
+    if (allow_long)
+    {
+        deh_allow_long_strings = long_strings;
+        deh_allow_long_cheats = long_cheats;
+    }
+
     return 1;
 }

-int DEH_LoadLumpByName(char *name)
+int DEH_LoadLumpByName(char *name, boolean allow_long)
 {
     int lumpnum;

@@ -386,7 +397,7 @@ int DEH_LoadLumpByName(char *name)
         return 0;
     }

-    return DEH_LoadLump(lumpnum);
+    return DEH_LoadLump(lumpnum, allow_long);
 }

 // Checks the command line for -deh argument
diff --git a/src/deh_main.h b/src/deh_main.h
index ea9e42da..7e0abe2d 100644
--- a/src/deh_main.h
+++ b/src/deh_main.h
@@ -41,8 +41,8 @@

 void DEH_Init(void);
 int DEH_LoadFile(char *filename);
-int DEH_LoadLump(int lumpnum);
-int DEH_LoadLumpByName(char *name);
+int DEH_LoadLump(int lumpnum, boolean allow_long);
+int DEH_LoadLumpByName(char *name, boolean allow_long);

 boolean DEH_ParseAssignment(char *line, char **variable_name, char **value);

diff --git a/src/doom/d_main.c b/src/doom/d_main.c
index 3badb4ad..4068f677 100644
--- a/src/doom/d_main.c
+++ b/src/doom/d_main.c
@@ -1050,7 +1050,7 @@ static void LoadHacxDeh(void)

     if (gameversion == exe_hacx)
     {
-        if (!DEH_LoadLumpByName("DEHACKED"))
+        if (!DEH_LoadLumpByName("DEHACKED", true))
         {
             I_Error("DEHACKED lump not found.  Please check that this is the "
                     "Hacx v1.2 IWAD.");
@@ -1425,6 +1425,31 @@ void D_DoomMain (void)
         I_PrintDivider();
     }

+    // Load DEHACKED lumps from WAD files - but only if we give the right
+    // command line parameter.
+
+    //!
+    // @category mod
+    //
+    // Load Dehacked patches from DEHACKED lumps contained in one of the
+    // loaded PWAD files.
+    //
+    if (M_ParmExists("-dehlump"))
+    {
+        int i, loaded = 0;
+
+        for (i = 0; i < numlumps; ++i)
+        {
+            if (!strncmp(lumpinfo[i].name, "DEHACKED", 8))
+            {
+                DEH_LoadLump(i, false);
+                loaded++;
+            }
+        }
+
+        printf("Loaded %i DEHACKED lumps from WAD files.\n", loaded);
+    }
+
     DEH_printf("I_Init: Setting up machine state.\n");
     I_CheckIsScreensaver();
     I_InitTimer();