shithub: choc

Download patch

ref: 8069d8a0fdf30516cb6eff6d6a9e2990061f95c1
parent: 0c0d4ed517a8a9559f96e92ef105e52eb01be1ee
author: Simon Howard <fraggle@gmail.com>
date: Sun Apr 18 12:40:14 EDT 2010

Add -hhever command line parameter to select patch version number.

Subversion-branch: /branches/raven-branch
Subversion-revision: 1902

--- a/src/heretic/deh_frame.c
+++ b/src/heretic/deh_frame.c
@@ -186,17 +186,10 @@
   DEH_MAPPING("Unknown 2",        misc2)
 DEH_END_MAPPING
 
-// When a HHE patch is first loaded, we must apply a small change
-// to the states[] table.  The table was changed between 1.0 and
-// 1.3 to add two extra frames to the player "burning death"
-// animation.
-// If we are using an HHE patch, the table must behave like the
-// Heretic 1.0 table.  We must therefore change the table to cut
-// these out again.
-
 static void DEH_FrameInit(void)
 {
-    states[S_PLAY_FDTH18].nextstate = S_NULL;
+    // Bit of a hack here:
+    DEH_HereticInit();
 }
 
 static void *DEH_FrameStart(deh_context_t *context, char *line)
--- a/src/heretic/deh_htic.c
+++ b/src/heretic/deh_htic.c
@@ -24,11 +24,15 @@
 //
 //-----------------------------------------------------------------------------
 
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
+
 #include "deh_defs.h"
 #include "deh_main.h"
 #include "deh_htic.h"
 #include "info.h"
+#include "m_argv.h"
 
 char *deh_signatures[] =
 {
@@ -37,6 +41,11 @@
     NULL
 };
 
+static char *hhe_versions[] =
+{
+    "1.0", "1.2", "1.3"
+};
+
 // Version number for patches.
 
 deh_hhe_version_t deh_hhe_version = deh_hhe_1_0;
@@ -72,9 +81,65 @@
     NULL
 };
 
+static void SetHHEVersionByName(char *name)
+{
+    int i;
+
+    for (i=0; i<arrlen(hhe_versions); ++i)
+    {
+        if (!strcmp(hhe_versions[i], name))
+        {
+            deh_hhe_version = i;
+            return;
+        }
+    }
+
+    fprintf(stderr, "Unknown Heretic version: %s\n", name);
+    fprintf(stderr, "Valid versions:\n");
+
+    for (i=0; i<arrlen(hhe_versions); ++i)
+    {
+        fprintf(stderr, "\t%s\n", hhe_versions[i]);
+    }
+}
+
+// Initialize Heretic(HHE)-specific dehacked bits.
+
+void DEH_HereticInit(void)
+{
+    int i;
+
+    //!
+    // @arg <version>
+    //
+    // Select the Heretic version number that was used to generate the
+    // HHE patch to be loaded.  Patches for each of the Vanilla
+    // Heretic versions (1.0, 1.2, 1.3) can be loaded, but the correct
+    // version number must be specified.
+
+    i = M_CheckParm("-hhever");
+
+    if (i > 0)
+    {
+        SetHHEVersionByName(myargv[i + 1]);
+    }
+
+    // For v1.0 patches, we must apply a slight change to the states[]
+    // table.  The table was changed between 1.0 and 1.3 to add two extra
+    // frames to the player "burning death" animation.
+    //
+    // If we are using a v1.0 patch, we must change the table to cut
+    // these out again.
+
+    if (deh_hhe_version < deh_hhe_1_2)
+    {
+        states[S_PLAY_FDTH18].nextstate = S_NULL;
+    }
+}
+
 int DEH_MapHereticFrameNumber(int frame)
 {
-    if (deh_hhe_version < deh_hhe_1_0)
+    if (deh_hhe_version < deh_hhe_1_2)
     {
         // Between Heretic 1.0 and 1.2, two new frames
         // were added to the "states" table, to extend the "flame death"
--- a/src/heretic/deh_htic.h
+++ b/src/heretic/deh_htic.h
@@ -50,6 +50,7 @@
 
 #define DEH_HERETIC_NUMMOBJTYPES (NUMMOBJTYPES - 2)
 
+void DEH_HereticInit(void);
 int DEH_MapHereticFrameNumber(int frame);
 
 extern deh_hhe_version_t deh_hhe_version;