foxygit / doom Log in
commit 63e1c884911f9e3382936f84a388e941b29343e6
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Wed Oct 8 00:52:03 2014 -0400
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Wed Oct 8 00:52:03 2014 -0400

    Allow -warp to episodes beyond episode 4.

    Vanilla Doom's -warp parameter allows warping to episodes beyond E4.
    This didn't work in Chocolate Doom because of some changes made
    to the G_InitNew code before the source release. Actual decompilation
    of that function in Vanilla Doom shows that the episode/map sanity
    checking is not present:

    http://pastie.org/8140437

    There is at least one known WAD (2002ado) that has a map on E5M1
    that is playable in Vanilla, and this stops that map from being
    possible to play. Comment out that code because it obviously
    doesn't deserve to be there.

    This fixes #426. Thanks plumsinus.
---
 src/doom/g_game.c | 143 ++++++++++++++++++++++++++++--------------------------
 1 file changed, 73 insertions(+), 70 deletions(-)

diff --git a/src/doom/g_game.c b/src/doom/g_game.c
index 6aab081d..0b9dda08 100644
--- a/src/doom/g_game.c
+++ b/src/doom/g_game.c
@@ -1683,27 +1683,32 @@ void
 G_InitNew
 ( skill_t	skill,
   int		episode,
-  int		map )
-{
+  int		map )
+{
     char *skytexturename;
-    int             i;
-
-    if (paused)
-    {
-	paused = false;
-	S_ResumeSound ();
-    }
-
+    int             i;

-    if (skill > sk_nightmare)
-	skill = sk_nightmare;
+    if (paused)
+    {
+	paused = false;
+	S_ResumeSound ();
+    }

+    /*
+    // Note: This commented-out block of code was added at some point
+    // between the DOS version(s) and the Doom source release. It isn't
+    // found in disassemblies of the DOS version and causes IDCLEV and
+    // the -warp command line parameter to behave differently.
+    // This is left here for posterity.
+
+    if (skill > sk_nightmare)
+	skill = sk_nightmare;

     // This was quite messy with SPECIAL and commented parts.
     // Supposedly hacks to make the latest edition work.
     // It might not work properly.
     if (episode < 1)
-      episode = 1;
+      episode = 1;

     if ( gamemode == retail )
     {
@@ -1712,62 +1717,60 @@ G_InitNew
     }
     else if ( gamemode == shareware )
     {
-      if (episode > 1)
+      if (episode > 1)
 	   episode = 1;	// only start episode 1 on shareware
-    }
+    }
     else
     {
       if (episode > 3)
 	episode = 3;
     }
-
+    */

-
-    if (map < 1)
+    if (map < 1)
 	map = 1;
-
+
     if ( (map > 9)
 	 && ( gamemode != commercial) )
-      map = 9;
-
-    M_ClearRandom ();
-
+      map = 9;
+
+    M_ClearRandom ();
+
     if (skill == sk_nightmare || respawnparm )
 	respawnmonsters = true;
     else
 	respawnmonsters = false;
-
+
     if (fastparm || (skill == sk_nightmare && gameskill != sk_nightmare) )
-    {
-	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
-	    states[i].tics >>= 1;
-	mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT;
-	mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT;
-	mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT;
-    }
-    else if (skill != sk_nightmare && gameskill == sk_nightmare)
-    {
-	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
-	    states[i].tics <<= 1;
-	mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT;
-	mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT;
-	mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT;
-    }
-
-
-    // force players to be initialized upon first level load
-    for (i=0 ; i<MAXPLAYERS ; i++)
-	players[i].playerstate = PST_REBORN;
-
-    usergame = true;                // will be set false if a demo
-    paused = false;
-    demoplayback = false;
-    automapactive = false;
-    viewactive = true;
-    gameepisode = episode;
-    gamemap = map;
-    gameskill = skill;
-
+    {
+	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
+	    states[i].tics >>= 1;
+	mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT;
+	mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT;
+	mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT;
+    }
+    else if (skill != sk_nightmare && gameskill == sk_nightmare)
+    {
+	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++)
+	    states[i].tics <<= 1;
+	mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT;
+	mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT;
+	mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT;
+    }
+
+    // force players to be initialized upon first level load
+    for (i=0 ; i<MAXPLAYERS ; i++)
+	players[i].playerstate = PST_REBORN;
+
+    usergame = true;                // will be set false if a demo
+    paused = false;
+    demoplayback = false;
+    automapactive = false;
+    viewactive = true;
+    gameepisode = episode;
+    gamemap = map;
+    gameskill = skill;
+
     viewactive = true;

     // Set the sky to use.
@@ -1791,32 +1794,32 @@ G_InitNew
     }
     else
     {
-        switch (gameepisode)
-        {
+        switch (gameepisode)
+        {
           default:
-          case 1:
-            skytexturename = "SKY1";
-            break;
-          case 2:
-            skytexturename = "SKY2";
-            break;
-          case 3:
-            skytexturename = "SKY3";
-            break;
+          case 1:
+            skytexturename = "SKY1";
+            break;
+          case 2:
+            skytexturename = "SKY2";
+            break;
+          case 3:
+            skytexturename = "SKY3";
+            break;
           case 4:        // Special Edition sky
             skytexturename = "SKY4";
             break;
-        }
+        }
     }

     skytexturename = DEH_String(skytexturename);

     skytexture = R_TextureNumForName(skytexturename);

-
-    G_DoLoadLevel ();
-}
-
+
+    G_DoLoadLevel ();
+}
+

 //
 // DEMO RECORDING