shithub: riscv

Download patch

ref: b579acef97171a057fb8f4c6fd2493690b5cf3c7
parent: f899b2fe3c091ccab33673f9fea9d1d99c0c2940
author: cinap_lenrek <[email protected]>
date: Thu Jul 30 15:55:13 EDT 2015

games/doom: add bug compatibility switches (thanks qu7uux)

these emulate bugs present in select versions of the released doom executables.
they are required to correctly play demos recorded with these but affect the
gameplay, so should be otherwise disabled.

-nobounce: lost souls don't bounce off floors and ceilings like intended due
to a misplaced check; this is fixed from ultimate doom on, but doom and doom2
are still affected.

-noztele: in final doom 1.9, things' altitude was erroneously not set to the
floor's height after teleporting. this was fixed in later versions of the
executables.

examples of desyncing demos:
(plutonia.wad, without -noztele) http://doomedsda.us/lmps/946/2/30pl2646.zip
(doom2.wad, without -nobounce) http://doomedsda.us/lmps/945/3/30nm2939.zip

--- a/sys/src/games/doom/d_main.c
+++ b/sys/src/games/doom/d_main.c
@@ -90,6 +90,9 @@
 
 boolean		singletics = false; // debug flag to cancel adaptiveness
 
+/* bug compatibility with various versions of doom */
+boolean		noztele;
+boolean		nobounce;
 
 
 //extern int soundVolume;
@@ -736,6 +739,10 @@
     respawnparm = M_CheckParm ("-respawn");
     fastparm = M_CheckParm ("-fast");
     devparm = M_CheckParm ("-devparm");
+    if (M_CheckParm ("-noztele") && gamemode == commercial)
+	noztele = 1;
+    if (M_CheckParm ("-nobounce") && (gamemode == commercial || gamemode == registered))
+	nobounce = 1;
     if (M_CheckParm ("-altdeath"))
 	deathmatch = 2;
     else if (M_CheckParm ("-deathmatch"))
--- a/sys/src/games/doom/p_local.h
+++ b/sys/src/games/doom/p_local.h
@@ -60,6 +60,8 @@
 // follow a player exlusively for 3 seconds
 #define	BASETHRESHOLD	 	100
 
+extern	boolean	noztele;
+extern	boolean	nobounce;
 
 
 //
--- a/sys/src/games/doom/p_mobj.c
+++ b/sys/src/games/doom/p_mobj.c
@@ -285,10 +285,7 @@
     {
 	// hit the floor
 
-	// Note (id):
-	//  somebody left this after the setting momz to 0,
-	//  kinda useless there.
-	if (mo->flags & MF_SKULLFLY)
+	if (!nobounce && mo->flags & MF_SKULLFLY)
 	{
 	    // the skull slammed into something
 	    mo->momz = -mo->momz;
@@ -309,6 +306,9 @@
 	    mo->momz = 0;
 	}
 	mo->z = mo->floorz;
+
+	if (nobounce && mo->flags & MF_SKULLFLY)
+	    mo->momz = -mo->momz;
 
 	if ( (mo->flags & MF_MISSILE)
 	     && !(mo->flags & MF_NOCLIP) )
--- a/sys/src/games/doom/p_telept.c
+++ b/sys/src/games/doom/p_telept.c
@@ -101,8 +101,9 @@
 				
 		if (!P_TeleportMove (thing, m->x, m->y))
 		    return 0;
-		
-		thing->z = thing->floorz;  //fixme: not needed?
+
+		if(!noztele)
+			thing->z = thing->floorz;
 		if (thing->player)
 		    thing->player->viewz = thing->z+thing->player->viewheight;