foxygit / doom Log in
commit 436d8edbb83fd51dd75563d608b5d592f9eecece
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Wed Oct 23 00:40:09 2013 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Wed Oct 23 00:40:09 2013 +0000

    When loading Heretic savegames, NULL out certain special values which
    hold pointers to other mobj_t objects that will no longer be valid.

    Subversion-branch: /branches/v2-branch
    Subversion-revision: 2718
---
 src/heretic/p_saveg.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/src/heretic/p_saveg.c b/src/heretic/p_saveg.c
index 195f36a4..e0983f8c 100644
--- a/src/heretic/p_saveg.c
+++ b/src/heretic/p_saveg.c
@@ -879,6 +879,32 @@ static void saveg_read_mobj_t(mobj_t *str)
     // specialval_t special2;
     saveg_read_specialval_t(&str->special2);

+    // Now we have a bunch of hacks to try to NULL out special values
+    // where special[12] contained a mobj_t pointer that isn't valid
+    // any more. This isn't in Vanilla but at least it stops the game
+    // from crashing.
+
+    switch (str->type)
+    {
+        // Gas pods use special2.m to point to the pod generator
+        // that made it.
+        case MT_POD:
+            str->special2.m = NULL;
+            break;
+
+        // Several thing types use special1.m to mean 'target':
+        case MT_MACEFX4:     // A_DeathBallImpact
+        case MT_WHIRLWIND:   // A_WhirlwindSeek
+        case MT_MUMMYFX1:    // A_MummyFX1Seek
+        case MT_HORNRODFX2:  // A_SkullRodPL2Seek
+        case MT_PHOENIXFX1:  // A_PhoenixPuff
+            str->special1.m = NULL;
+            break;
+
+        default:
+            break;
+    }
+
     // int health;
     str->health = SV_ReadLong();