summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/heretic/deh_htic.c38
-rw-r--r--src/heretic/deh_htic.h13
2 files changed, 42 insertions, 9 deletions
diff --git a/src/heretic/deh_htic.c b/src/heretic/deh_htic.c
index 59c426ef..ff5d02ac 100644
--- a/src/heretic/deh_htic.c
+++ b/src/heretic/deh_htic.c
@@ -27,6 +27,7 @@
#include <stdlib.h>
#include "deh_defs.h"
#include "deh_main.h"
+#include "deh_htic.h"
#include "info.h"
char *deh_signatures[] =
@@ -36,6 +37,10 @@ char *deh_signatures[] =
NULL
};
+// Version number for patches.
+
+deh_hhe_version_t deh_hhe_version = deh_hhe_1_0;
+
// deh_ammo.c:
extern deh_section_t deh_section_ammo;
// deh_frame.c:
@@ -67,18 +72,33 @@ deh_section_t *deh_section_types[] =
NULL
};
-// HHE only worked with Heretic 1.0 and unfortunately was never updated
-// to support Heretic 1.3. Between Heretic 1.0 and 1.3, two new frames
-// were added to the "states" table, to extend the "flame death"
-// animation displayed when the player is killed by fire. Therefore,
-// we must map the HHE frame numbers (which assume a Heretic 1.0 frame
-// table) to corresponding indexes for the Heretic 1.3 frame table.
-
int DEH_MapHereticFrameNumber(int frame)
{
- if (frame >= S_PLAY_FDTH19)
+ if (deh_hhe_version < deh_hhe_1_0)
{
- frame = (frame - S_PLAY_FDTH19) + S_BLOODYSKULL1;
+ // Between Heretic 1.0 and 1.2, two new frames
+ // were added to the "states" table, to extend the "flame death"
+ // animation displayed when the player is killed by fire. Therefore,
+ // we must map Heretic 1.0 frame numbers to corresponding indexes
+ // for our state table.
+
+ if (frame >= S_PLAY_FDTH19)
+ {
+ frame = (frame - S_PLAY_FDTH19) + S_BLOODYSKULL1;
+ }
+ }
+ else
+ {
+ // After Heretic 1.2, three unused frames were removed from the
+ // states table, unused phoenix rod frames. Our state table includes
+ // these missing states for backwards compatibility. We must therefore
+ // adjust frame numbers for v1.2/v1.3 to corresponding indexes for
+ // our state table.
+
+ if (frame >= S_PHOENIXFXIX_1)
+ {
+ frame = (frame - S_PHOENIXFXIX_1) + S_PHOENIXPUFF1;
+ }
}
return frame;
diff --git a/src/heretic/deh_htic.h b/src/heretic/deh_htic.h
index fefcf818..199ad2fe 100644
--- a/src/heretic/deh_htic.h
+++ b/src/heretic/deh_htic.h
@@ -29,6 +29,17 @@
#include "info.h"
+// HHE executable version. Loading HHE patches is (unfortunately)
+// dependent on the version of the Heretic executable used to make them.
+
+typedef enum
+{
+ deh_hhe_1_0,
+ deh_hhe_1_2,
+ deh_hhe_1_3,
+ deh_hhe_num_versions
+} deh_hhe_version_t;
+
// HHE doesn't know about the last two states in the state table, so
// these are considered invalid.
@@ -41,5 +52,7 @@
int DEH_MapHereticFrameNumber(int frame);
+extern deh_hhe_version_t deh_hhe_version;
+
#endif /* #ifndef DEH_HTIC_H */