shithub: choc

Download patch

ref: e81e9d80c45f6ec0698adfbc77b10e37df8c4c26
parent: 725090a6ac3b526560082681e3329effd800bd5b
author: James Haley <[email protected]>
date: Fri Feb 4 20:23:54 EST 2011

Finished second passes through p_map and p_maputl - modules are largely
finalized. Fixes/additions include adjusted dropoff height in P_TryMove,
order-of-evaluation fix in PIT_ChangeSector, proper spechit overrun
emulation, and Rogue's fix which prevents intercepts overflows.

Subversion-branch: /branches/strife-branch
Subversion-revision: 2247

--- a/src/strife/p_map.c
+++ b/src/strife/p_map.c
@@ -123,7 +123,7 @@
 //
 boolean PIT_StompThing (mobj_t* thing)
 {
-    fixed_t	blockdist;
+    fixed_t blockdist;
 
     if (!(thing->flags & MF_SHOOTABLE) )
         return true;
@@ -146,7 +146,7 @@
     // Monsters can telefrag players, and players can telefrag monsters, but
     // monsters cannot telefrag other monsters.
     if (!(tmthing->player || thing->player))
-        return false;	
+        return false;
 
     P_DamageMobj (thing, tmthing, tmthing, 10000);
 
@@ -212,7 +212,7 @@
     P_UnsetThingPosition (thing);
 
     thing->floorz = tmfloorz;
-    thing->ceilingz = tmceilingz;	
+    thing->ceilingz = tmceilingz;
     thing->x = x;
     thing->y = y;
     thing->z = tmfloorz; // haleyjd 09/15/10: [STRIFE] Rogue added a z-set here
@@ -451,17 +451,17 @@
 //
 boolean
 P_CheckPosition
-( mobj_t*	thing,
-  fixed_t	x,
-  fixed_t	y )
+( mobj_t*   thing,
+  fixed_t   x,
+  fixed_t   y )
 {
-    int			xl;
-    int			xh;
-    int			yl;
-    int			yh;
-    int			bx;
-    int			by;
-    subsector_t*	newsubsec;
+    int             xl;
+    int             xh;
+    int             yl;
+    int             yh;
+    int             bx;
+    int             by;
+    subsector_t*    newsubsec;
 
     tmthing = thing;
     tmflags = thing->flags;
@@ -534,26 +534,26 @@
   fixed_t	x,
   fixed_t	y )
 {
-    fixed_t	oldx;
-    fixed_t	oldy;
-    int		side;
-    int		oldside;
-    line_t*	ld;
+    fixed_t oldx;
+    fixed_t oldy;
+    int     side;
+    int     oldside;
+    line_t* ld;
 
     floatok = false;
     if (!P_CheckPosition (thing, x, y))
-        return false;		// solid wall or thing
+        return false;       // solid wall or thing
 
     if ( !(thing->flags & MF_NOCLIP) )
     {
         if (tmceilingz - tmfloorz < thing->height)
-            return false;	// doesn't fit
+            return false;   // doesn't fit
 
         floatok = true;
 
         // villsa [STRIFE] Removed MF_TELEPORT
         if (tmceilingz - thing->z < thing->height)
-            return false;	// mobj must lower itself to fit
+            return false;       // mobj must lower itself to fit
 
         // villsa [STRIFE] non-robots are limited to 16 unit step height
         if ((thing->flags & MF_NOBLOOD) == 0 && tmfloorz - thing->z > (16*FRACUNIT))
@@ -562,12 +562,13 @@
             return false;       // too big a step up
 
         // villsa [STRIFE] special case for missiles
-        if(thing->flags & MF_MISSILE && tmfloorz - thing->z > (4*FRACUNIT))
+        if((thing->flags & MF_MISSILE) && tmfloorz - thing->z > 4*FRACUNIT)
             return false;
 
+        // haleyjd 20110204 [STRIFE]: dropoff height changed 24 -> 32
         if ( !(thing->flags&(MF_DROPOFF|MF_FLOAT))
-            && tmfloorz - tmdropoffz > 24*FRACUNIT )
-            return false;	// don't stand over a dropoff
+            && tmfloorz - tmdropoffz > 32*FRACUNIT ) 
+            return false;       // don't stand over a dropoff
     }
     
     // the move is ok,
@@ -577,7 +578,7 @@
     oldx = thing->x;
     oldy = thing->y;
     thing->floorz = tmfloorz;
-    thing->ceilingz = tmceilingz;	
+    thing->ceilingz = tmceilingz;
     thing->x = x;
     thing->y = y;
 
@@ -605,10 +606,10 @@
 
 //
 // P_CheckPositionZ
+//
 // villsa [STRIFE] new function
-// Check colliding things on top of one another
+// Check colliding things on top of one another; ie., 3D Object Clipping
 //
-
 boolean P_CheckPositionZ(mobj_t* thing, fixed_t height)
 {
     fixed_t         x;
@@ -665,12 +666,12 @@
 
     for(bx = xl; bx <= xh; bx++)
     {
-	for(by = yl; by <= yh; by++)
+        for(by = yl; by <= yh; by++)
         {
-	    if(!P_BlockThingsIterator(bx, by,PIT_CheckThing))
+            if(!P_BlockThingsIterator(bx, by, PIT_CheckThing))
             {
                 tmthing->z = z;
-		return false;
+                return false;
             }
         }
     }
@@ -689,33 +690,35 @@
 // the z will be set to the lowest value
 // and false will be returned.
 //
+// [STRIFE] Verified unmodified
+//
 boolean P_ThingHeightClip (mobj_t* thing)
 {
-    boolean		onfloor;
-	
+    boolean     onfloor;
+
     onfloor = (thing->z == thing->floorz);
-	
-    P_CheckPosition (thing, thing->x, thing->y);	
+
+    P_CheckPosition (thing, thing->x, thing->y);
     // what about stranding a monster partially off an edge?
-	
+
     thing->floorz = tmfloorz;
     thing->ceilingz = tmceilingz;
-	
+
     if (onfloor)
     {
-	// walking monsters rise and fall with the floor
-	thing->z = thing->floorz;
+        // walking monsters rise and fall with the floor
+        thing->z = thing->floorz;
     }
     else
     {
-	// don't adjust a floating monster unless forced to
-	if (thing->z+thing->height > thing->ceilingz)
-	    thing->z = thing->ceilingz - thing->height;
+        // don't adjust a floating monster unless forced to
+        if (thing->z+thing->height > thing->ceilingz)
+            thing->z = thing->ceilingz - thing->height;
     }
-	
+
     if (thing->ceilingz - thing->floorz < thing->height)
-	return false;
-		
+        return false;
+
     return true;
 }
 
@@ -743,47 +746,49 @@
 // Adjusts the xmove / ymove
 // so that the next move will slide along the wall.
 //
+// [STRIFE] Verified unmodified
+//
 void P_HitSlideLine (line_t* ld)
 {
-    int			side;
+    int         side;
 
-    angle_t		lineangle;
-    angle_t		moveangle;
-    angle_t		deltaangle;
-    
-    fixed_t		movelen;
-    fixed_t		newlen;
-	
-	
+    angle_t     lineangle;
+    angle_t     moveangle;
+    angle_t     deltaangle;
+
+    fixed_t     movelen;
+    fixed_t     newlen;
+
+
     if (ld->slopetype == ST_HORIZONTAL)
     {
-	tmymove = 0;
-	return;
+        tmymove = 0;
+        return;
     }
-    
+
     if (ld->slopetype == ST_VERTICAL)
     {
-	tmxmove = 0;
-	return;
+        tmxmove = 0;
+        return;
     }
-	
+
     side = P_PointOnLineSide (slidemo->x, slidemo->y, ld);
-	
+
     lineangle = R_PointToAngle2 (0,0, ld->dx, ld->dy);
 
     if (side == 1)
-	lineangle += ANG180;
+        lineangle += ANG180;
 
     moveangle = R_PointToAngle2 (0,0, tmxmove, tmymove);
     deltaangle = moveangle-lineangle;
 
     if (deltaangle > ANG180)
-	deltaangle += ANG180;
-    //	I_Error ("SlideLine: ang>ANG180");
+        deltaangle += ANG180;
+    //  I_Error ("SlideLine: ang>ANG180");
 
     lineangle >>= ANGLETOFINESHIFT;
     deltaangle >>= ANGLETOFINESHIFT;
-	
+
     movelen = P_AproxDistance (tmxmove, tmymove);
     newlen = FixedMul (movelen, finecosine[deltaangle]);
 
@@ -795,53 +800,55 @@
 //
 // PTR_SlideTraverse
 //
+// [STRIFE] Modified for smaller step-up height
+//
 boolean PTR_SlideTraverse (intercept_t* in)
 {
-    line_t*	li;
-	
+    line_t* li;
+
     if (!in->isaline)
-	I_Error ("PTR_SlideTraverse: not a line?");
-		
+        I_Error ("PTR_SlideTraverse: not a line?");
+
     li = in->d.line;
-    
+
     if ( ! (li->flags & ML_TWOSIDED) )
     {
-	if (P_PointOnLineSide (slidemo->x, slidemo->y, li))
-	{
-	    // don't hit the back side
-	    return true;		
-	}
-	goto isblocking;
+        if (P_PointOnLineSide (slidemo->x, slidemo->y, li))
+        {
+            // don't hit the back side
+            return true;
+        }
+        goto isblocking;
     }
 
     // set openrange, opentop, openbottom
     P_LineOpening (li);
-    
+
     if (openrange < slidemo->height)
-	goto isblocking;		// doesn't fit
-		
+        goto isblocking;        // doesn't fit
+
     if (opentop - slidemo->z < slidemo->height)
-	goto isblocking;		// mobj is too high
+        goto isblocking;        // mobj is too high
 
     // villsa [STRIFE] change from 24 to 16
     if (openbottom - slidemo->z > 16*FRACUNIT )
-	goto isblocking;		// too big a step up
+        goto isblocking;        // too big a step up
 
     // this line doesn't block movement
-    return true;		
-	
+    return true;
+
     // the line does block movement,
     // see if it is closer than best so far
-  isblocking:		
+isblocking:
     if (in->frac < bestslidefrac)
     {
-	secondslidefrac = bestslidefrac;
-	secondslideline = bestslideline;
-	bestslidefrac = in->frac;
-	bestslideline = li;
+        secondslidefrac = bestslidefrac;
+        secondslideline = bestslideline;
+        bestslidefrac = in->frac;
+        bestslideline = li;
     }
-	
-    return false;	// stop
+
+    return false;   // stop
 }
 
 
@@ -855,98 +862,99 @@
 //
 // This is a kludgy mess.
 //
+// [STRIFE] Verified unmodified
+//
 void P_SlideMove (mobj_t* mo)
 {
-    fixed_t		leadx;
-    fixed_t		leady;
-    fixed_t		trailx;
-    fixed_t		traily;
-    fixed_t		newx;
-    fixed_t		newy;
-    int			hitcount;
-		
+    fixed_t     leadx;
+    fixed_t     leady;
+    fixed_t     trailx;
+    fixed_t     traily;
+    fixed_t     newx;
+    fixed_t     newy;
+    int         hitcount;
+
     slidemo = mo;
     hitcount = 0;
     
-  retry:
+retry:
     if (++hitcount == 3)
-	goto stairstep;		// don't loop forever
+        goto stairstep;     // don't loop forever
 
-    
     // trace along the three leading corners
     if (mo->momx > 0)
     {
-	leadx = mo->x + mo->radius;
-	trailx = mo->x - mo->radius;
+        leadx = mo->x + mo->radius;
+        trailx = mo->x - mo->radius;
     }
     else
     {
-	leadx = mo->x - mo->radius;
-	trailx = mo->x + mo->radius;
+        leadx = mo->x - mo->radius;
+        trailx = mo->x + mo->radius;
     }
-	
+
     if (mo->momy > 0)
     {
-	leady = mo->y + mo->radius;
-	traily = mo->y - mo->radius;
+        leady = mo->y + mo->radius;
+        traily = mo->y - mo->radius;
     }
     else
     {
-	leady = mo->y - mo->radius;
-	traily = mo->y + mo->radius;
+        leady = mo->y - mo->radius;
+        traily = mo->y + mo->radius;
     }
-		
+
     bestslidefrac = FRACUNIT+1;
-	
+
     P_PathTraverse ( leadx, leady, leadx+mo->momx, leady+mo->momy,
-		     PT_ADDLINES, PTR_SlideTraverse );
+                     PT_ADDLINES, PTR_SlideTraverse );
     P_PathTraverse ( trailx, leady, trailx+mo->momx, leady+mo->momy,
-		     PT_ADDLINES, PTR_SlideTraverse );
+                     PT_ADDLINES, PTR_SlideTraverse );
     P_PathTraverse ( leadx, traily, leadx+mo->momx, traily+mo->momy,
-		     PT_ADDLINES, PTR_SlideTraverse );
+                     PT_ADDLINES, PTR_SlideTraverse );
     
     // move up to the wall
     if (bestslidefrac == FRACUNIT+1)
     {
-	// the move most have hit the middle, so stairstep
-      stairstep:
-	if (!P_TryMove (mo, mo->x, mo->y + mo->momy))
-	    P_TryMove (mo, mo->x + mo->momx, mo->y);
-	return;
+        // the move most have hit the middle, so stairstep
+stairstep:
+        if (!P_TryMove (mo, mo->x, mo->y + mo->momy))
+            P_TryMove (mo, mo->x + mo->momx, mo->y);
+        return;
     }
 
     // fudge a bit to make sure it doesn't hit
-    bestslidefrac -= 0x800;	
+    bestslidefrac -= 0x800;
     if (bestslidefrac > 0)
     {
-	newx = FixedMul (mo->momx, bestslidefrac);
-	newy = FixedMul (mo->momy, bestslidefrac);
-	
-	if (!P_TryMove (mo, mo->x+newx, mo->y+newy))
-	    goto stairstep;
+        newx = FixedMul (mo->momx, bestslidefrac);
+        newy = FixedMul (mo->momy, bestslidefrac);
+
+        if (!P_TryMove (mo, mo->x+newx, mo->y+newy))
+            goto stairstep;
     }
     
     // Now continue along the wall.
     // First calculate remainder.
     bestslidefrac = FRACUNIT-(bestslidefrac+0x800);
-    
+
     if (bestslidefrac > FRACUNIT)
-	bestslidefrac = FRACUNIT;
-    
+        bestslidefrac = FRACUNIT;
+
     if (bestslidefrac <= 0)
-	return;
-    
+        return;
+
     tmxmove = FixedMul (mo->momx, bestslidefrac);
     tmymove = FixedMul (mo->momy, bestslidefrac);
 
-    P_HitSlideLine (bestslideline);	// clip the moves
+    P_HitSlideLine (bestslideline); // clip the moves
 
     mo->momx = tmxmove;
     mo->momy = tmymove;
-		
+
     if (!P_TryMove (mo, mo->x+tmxmove, mo->y+tmymove))
     {
-	goto retry;
+        goto retry;
     }
 }
 
@@ -975,33 +983,35 @@
 // PTR_AimTraverse
 // Sets linetaget and aimslope when a target is aimed at.
 //
+// [STRIFE] Verified unmodified
+//
 boolean
 PTR_AimTraverse (intercept_t* in)
 {
-    line_t*		li;
-    mobj_t*		th;
-    fixed_t		slope;
-    fixed_t		thingtopslope;
-    fixed_t		thingbottomslope;
-    fixed_t		dist;
-		
+    line_t*     li;
+    mobj_t*     th;
+    fixed_t     slope;
+    fixed_t     thingtopslope;
+    fixed_t     thingbottomslope;
+    fixed_t     dist;
+
     if (in->isaline)
     {
-	li = in->d.line;
-	
-	if ( !(li->flags & ML_TWOSIDED) )
-	    return false;		// stop
-	
-	// Crosses a two sided line.
-	// A two sided line will restrict
-	// the possible target ranges.
-	P_LineOpening (li);
-	
-	if (openbottom >= opentop)
-	    return false;		// stop
-	
-	dist = FixedMul (attackrange, in->frac);
+        li = in->d.line;
 
+        if ( !(li->flags & ML_TWOSIDED) )
+            return false;       // stop
+
+        // Crosses a two sided line.
+        // A two sided line will restrict
+        // the possible target ranges.
+        P_LineOpening (li);
+
+        if (openbottom >= opentop)
+            return false;       // stop
+
+        dist = FixedMul (attackrange, in->frac);
+
         // Return false if there is no back sector.  This should never
         // be the case if the line is two-sided; however, some WADs
         // (eg. ottawau.wad) use this as an "impassible glass" trick
@@ -1013,32 +1023,32 @@
         }
 
         if (li->frontsector->floorheight != li->backsector->floorheight)
-	{
-	    slope = FixedDiv (openbottom - shootz , dist);
-	    if (slope > bottomslope)
-		bottomslope = slope;
-	}
-		
-	if (li->frontsector->ceilingheight != li->backsector->ceilingheight)
-	{
-	    slope = FixedDiv (opentop - shootz , dist);
-	    if (slope < topslope)
-		topslope = slope;
-	}
-		
-	if (topslope <= bottomslope)
-	    return false;		// stop
-			
-	return true;			// shot continues
+        {
+            slope = FixedDiv (openbottom - shootz , dist);
+            if (slope > bottomslope)
+                bottomslope = slope;
+        }
+
+        if (li->frontsector->ceilingheight != li->backsector->ceilingheight)
+        {
+            slope = FixedDiv (opentop - shootz , dist);
+            if (slope < topslope)
+                topslope = slope;
+        }
+
+        if (topslope <= bottomslope)
+            return false;       // stop
+
+        return true;            // shot continues
     }
-    
+
     // shoot a thing
     th = in->d.thing;
     if (th == shootthing)
-	return true;			// can't shoot self
-    
+        return true;            // can't shoot self
+
     if (!(th->flags&MF_SHOOTABLE))
-	return true;			// corpse or something
+        return true;            // corpse or something
 
     // check angles to see if the thing can be aimed at
     dist = FixedMul (attackrange, in->frac);
@@ -1045,24 +1055,24 @@
     thingtopslope = FixedDiv (th->z+th->height - shootz , dist);
 
     if (thingtopslope < bottomslope)
-	return true;			// shot over the thing
+        return true;            // shot over the thing
 
     thingbottomslope = FixedDiv (th->z - shootz, dist);
 
     if (thingbottomslope > topslope)
-	return true;			// shot under the thing
-    
+        return true;            // shot under the thing
+
     // this thing can be hit!
     if (thingtopslope > topslope)
-	thingtopslope = topslope;
-    
+        thingtopslope = topslope;
+
     if (thingbottomslope < bottomslope)
-	thingbottomslope = bottomslope;
+        thingbottomslope = bottomslope;
 
     aimslope = (thingtopslope+thingbottomslope)/2;
     linetarget = th;
 
-    return false;			// don't go any farther
+    return false;               // don't go any farther
 }
 
 
@@ -1069,6 +1079,8 @@
 //
 // PTR_ShootTraverse
 //
+// [STRIFE] Changes for Spectres and Mauler puff/damage inflictor
+//
 boolean PTR_ShootTraverse (intercept_t* in)
 {
     fixed_t             x;
@@ -1142,7 +1154,7 @@
 
             // it's a sky hack wall
             if	(li->backsector && li->backsector->ceilingpic == skyflatnum)
-                return false;		
+                return false;
         }
 
         // villsa [STRIFE]
@@ -1149,7 +1161,7 @@
         if(la_damage > 0)
         {
             // villsa [STRIFE] Test against Mauler attack range
-            if(attackrange != (2112*FRACUNIT))
+            if(attackrange != 2112*FRACUNIT)
                 P_SpawnPuff(x, y, z); // Spawn bullet puffs.
             else
                 P_SpawnMobj(x, y, z, MT_STRIFEPUFF3);
@@ -1162,14 +1174,14 @@
     // shoot a thing
     th = in->d.thing;
     if (th == shootthing)
-        return true;		// can't shoot self
+        return true;        // can't shoot self
 
     if (!(th->flags&MF_SHOOTABLE))
-        return true;		// corpse or something
+        return true;        // corpse or something
 
     // haleyjd 09/18/10: [STRIFE] Corrected - not MVIS, but SPECTRAL.
     if(th->flags & MF_SPECTRAL)
-        return true;
+        return true;        // is a spectral entity
 
     // check angles to see if the thing can be aimed at
     dist = FixedMul (attackrange, in->frac);
@@ -1176,14 +1188,13 @@
     thingtopslope = FixedDiv (th->z+th->height - shootz , dist);
 
     if (thingtopslope < aimslope)
-        return true;		// shot over the thing
+        return true;        // shot over the thing
 
     thingbottomslope = FixedDiv (th->z - shootz, dist);
 
     if (thingbottomslope > aimslope)
-        return true;		// shot under the thing
+        return true;        // shot under the thing
 
-
     // hit thing
     // position a bit closer
     frac = in->frac - FixedDiv (10*FRACUNIT,attackrange);
@@ -1192,8 +1203,8 @@
     y = trace.y + FixedMul (trace.dy, frac);
     z = shootz + FixedMul (aimslope, FixedMul(frac, attackrange));
 
-    // villsa [STRIFE] TODO - verify purpose of this
-    if(attackrange == (2112*FRACUNIT))
+    // villsa [STRIFE] Check for Mauler attack range
+    if(attackrange == 2112*FRACUNIT)
     {
         th2 = P_SpawnMobj(x, y, z, MT_STRIFEPUFF3);
         th2->momz = -FRACUNIT;
@@ -1201,7 +1212,7 @@
         return false;
     }
 
-    // villsa [STRIFE] TODO - verify disabled check for damage?
+    // villsa [STRIFE] disabled check for damage
     //if (la_damage)
     P_DamageMobj (th, shootthing, shootthing, la_damage);
 
@@ -1221,6 +1232,8 @@
 //
 // P_AimLineAttack
 //
+// [STRIFE] Modified to support player->pitch
+//
 fixed_t
 P_AimLineAttack
 ( mobj_t*	t1,
@@ -1268,6 +1281,8 @@
 // If damage == 0, it is just a test trace
 // that will leave linetarget set.
 //
+// [STRIFE] Modified to check lines only if damage <= 0 (see P_RadiusAttack)
+//
 void
 P_LineAttack
 ( mobj_t*	t1,
@@ -1279,7 +1294,7 @@
     fixed_t	x2;
     fixed_t	y2;
     int         traverseflags;
-	
+
     angle >>= ANGLETOFINESHIFT;
     shootthing = t1;
     la_damage = damage;
@@ -1306,32 +1321,34 @@
 //
 // USE LINES
 //
-mobj_t*		usething;
+// [STRIFE] Verified unmodified
+//
+mobj_t*     usething;
 
-boolean	PTR_UseTraverse (intercept_t* in)
+boolean PTR_UseTraverse (intercept_t* in)
 {
-    int		side;
-	
+    int     side;
+
     if (!in->d.line->special)
     {
-	P_LineOpening (in->d.line);
-	if (openrange <= 0)
-	{
-	    S_StartSound (usething, sfx_noway);
-	    
-	    // can't use through a wall
-	    return false;	
-	}
-	// not a special line, but keep checking
-	return true ;		
+        P_LineOpening (in->d.line);
+        if (openrange <= 0)
+        {
+            S_StartSound (usething, sfx_noway);
+
+            // can't use through a wall
+            return false;
+        }
+        // not a special line, but keep checking
+        return true ;
     }
-	
+
     side = 0;
     if (P_PointOnLineSide (usething->x, usething->y, in->d.line) == 1)
-	side = 1;
-    
-    //	return false;		// don't use back side
-	
+        side = 1;
+
+    //  return false;       // don't use back side
+
     P_UseSpecialLine (usething, in->d.line, side);
 
     // can't use for than one special line in a row
@@ -1343,16 +1360,18 @@
 // P_UseLines
 // Looks for special lines in front of the player to activate.
 //
-void P_UseLines (player_t*	player) 
+// [STRIFE] Verified unmodified
+//
+void P_UseLines (player_t*	player)
 {
-    int		angle;
-    fixed_t	x1;
-    fixed_t	y1;
-    fixed_t	x2;
-    fixed_t	y2;
-	
+    int     angle;
+    fixed_t x1;
+    fixed_t y1;
+    fixed_t x2;
+    fixed_t y2;
+
     usething = player->mo;
-		
+
     angle = player->mo->angle >> ANGLETOFINESHIFT;
 
     x1 = player->mo->x;
@@ -1359,7 +1378,7 @@
     y1 = player->mo->y;
     x2 = x1 + (USERANGE>>FRACBITS)*finecosine[angle];
     y2 = y1 + (USERANGE>>FRACBITS)*finesine[angle];
-	
+
     P_PathTraverse ( x1, y1, x2, y2, PT_ADDLINES, PTR_UseTraverse );
 }
 
@@ -1367,9 +1386,9 @@
 //
 // RADIUS ATTACK
 //
-mobj_t*		bombsource;
-mobj_t*		bombspot;
-int		bombdamage;
+mobj_t*     bombsource;
+mobj_t*     bombspot;
+int         bombdamage;
 
 
 //
@@ -1377,11 +1396,13 @@
 // "bombsource" is the creature
 // that caused the explosion at "bombspot".
 //
+// [STRIFE] Modified for Spectral and Inquisitor exclusions
+//
 boolean PIT_RadiusAttack (mobj_t* thing)
 {
-    fixed_t	dx;
-    fixed_t	dy;
-    fixed_t	dist;
+    fixed_t dx;
+    fixed_t dy;
+    fixed_t dist;
 
     if (!(thing->flags & MF_SHOOTABLE))
         return true;
@@ -1408,7 +1429,7 @@
         dist = 0;
 
     if (dist >= bombdamage)
-        return true;	// out of range
+        return true;        // out of range
 
     if ( P_CheckSight (thing, bombspot) )
     {
@@ -1424,6 +1445,9 @@
 // P_RadiusAttack
 // Source is the creature that caused the explosion at spot.
 //
+// [STRIFE] Modified to emit "test" tracers which can shatter glass screens
+//          and windows.
+//
 void
 P_RadiusAttack
 ( mobj_t*       spot,
@@ -1484,7 +1508,9 @@
 //
 // PIT_ChangeSector
 //
-boolean PIT_ChangeSector (mobj_t*	thing)
+// [STRIFE] Changes to crushing behavior
+//
+boolean PIT_ChangeSector (mobj_t*   thing)
 {
     mobj_t*	mo;
 
@@ -1494,7 +1520,6 @@
         return true;
     }
 
-
     // crunch bodies to giblets
     if (thing->health <= 0)
     {
@@ -1521,7 +1546,7 @@
         P_RemoveMobj (thing);
 
         // keep checking
-        return true;		
+        return true;
     }
 
     if (! (thing->flags & MF_SHOOTABLE) )
@@ -1534,6 +1559,7 @@
 
     if (crushchange && !(leveltime&3) )
     {
+        int t;
         S_StartSound(thing, sfx_pcrush);   // villsa [STRIFE]
         P_DamageMobj(thing,NULL,NULL,10);
 
@@ -1542,11 +1568,13 @@
                           thing->y,
                           thing->z + thing->height/2, MT_BLOOD_DEATH);
 
-        mo->momx = (P_Random() - P_Random ())<<12;
-        mo->momy = (P_Random() - P_Random ())<<12;
+        t = P_Random();
+        mo->momx = (t - P_Random ()) << 12;
+        t = P_Random();
+        mo->momy = (t - P_Random ()) << 12;
     }
 
-    // keep checking (crush other things)	
+    // keep checking (crush other things)
     return true;
 }
 
@@ -1555,23 +1583,24 @@
 //
 // P_ChangeSector
 //
+// [STRIFE] Verified unmodified
+//
 boolean
 P_ChangeSector
-( sector_t*	sector,
-  boolean	crunch )
+( sector_t* sector,
+  boolean   crunch )
 {
-    int		x;
-    int		y;
-	
+    int     x;
+    int     y;
+
     nofit = false;
     crushchange = crunch;
-	
+
     // re-check heights for all things near the moving sector
     for (x=sector->blockbox[BOXLEFT] ; x<= sector->blockbox[BOXRIGHT] ; x++)
-	for (y=sector->blockbox[BOXBOTTOM];y<= sector->blockbox[BOXTOP] ; y++)
-	    P_BlockThingsIterator (x, y, PIT_ChangeSector);
-	
-	
+        for (y=sector->blockbox[BOXBOTTOM];y<= sector->blockbox[BOXTOP] ; y++)
+            P_BlockThingsIterator (x, y, PIT_ChangeSector);
+
     return nofit;
 }
 
@@ -1624,10 +1653,10 @@
             tmbbox[numspechit-9] = addr;
             break;
         case 13: 
-            crushchange = addr; 
-            break;
+            nofit = addr; // haleyjd 20110204: nofit/crushchange are in opposite 
+            break;        // order in the Strife binary.
         case 14: 
-            nofit = addr; 
+            crushchange = addr; 
             break;
         default:
             fprintf(stderr, "SpechitOverrun: Warning: unable to emulate"
--- a/src/strife/p_maputl.c
+++ b/src/strife/p_maputl.c
@@ -47,7 +47,8 @@
 // P_AproxDistance
 // Gives an estimation of distance (not exact)
 //
-
+// [STRIFE] Verified unmodified
+//
 fixed_t
 P_AproxDistance
 ( fixed_t	dx,
@@ -56,7 +57,7 @@
     dx = abs(dx);
     dy = abs(dy);
     if (dx < dy)
-	return dx+dy-(dx>>1);
+        return dx+dy-(dx>>1);
     return dx+dy-(dy>>1);
 }
 
@@ -65,6 +66,8 @@
 // P_PointOnLineSide
 // Returns 0 or 1
 //
+// [STRIFE] Verified unmodified
+//
 int
 P_PointOnLineSide
 ( fixed_t	x,
@@ -71,35 +74,35 @@
   fixed_t	y,
   line_t*	line )
 {
-    fixed_t	dx;
-    fixed_t	dy;
-    fixed_t	left;
-    fixed_t	right;
-	
+    fixed_t dx;
+    fixed_t dy;
+    fixed_t left;
+    fixed_t right;
+
     if (!line->dx)
     {
-	if (x <= line->v1->x)
-	    return line->dy > 0;
-	
-	return line->dy < 0;
+        if (x <= line->v1->x)
+            return line->dy > 0;
+
+        return line->dy < 0;
     }
     if (!line->dy)
     {
-	if (y <= line->v1->y)
-	    return line->dx < 0;
-	
-	return line->dx > 0;
+        if (y <= line->v1->y)
+            return line->dx < 0;
+
+        return line->dx > 0;
     }
-	
+
     dx = (x - line->v1->x);
     dy = (y - line->v1->y);
-	
+
     left = FixedMul ( line->dy>>FRACBITS , dx );
     right = FixedMul ( dy , line->dx>>FRACBITS );
-	
+
     if (right < left)
-	return 0;		// front side
-    return 1;			// back side
+        return 0;       // front side
+    return 1;           // back side
 }
 
 
@@ -109,49 +112,51 @@
 // Considers the line to be infinite
 // Returns side 0 or 1, -1 if box crosses the line.
 //
+// [STRIFE] Verified unmodified
+//
 int
 P_BoxOnLineSide
-( fixed_t*	tmbox,
-  line_t*	ld )
+( fixed_t*  tmbox,
+  line_t*   ld )
 {
-    int		p1 = 0;
-    int		p2 = 0;
-	
+    int     p1 = 0;
+    int     p2 = 0;
+
     switch (ld->slopetype)
     {
-      case ST_HORIZONTAL:
-	p1 = tmbox[BOXTOP] > ld->v1->y;
-	p2 = tmbox[BOXBOTTOM] > ld->v1->y;
-	if (ld->dx < 0)
-	{
-	    p1 ^= 1;
-	    p2 ^= 1;
-	}
-	break;
-	
-      case ST_VERTICAL:
-	p1 = tmbox[BOXRIGHT] < ld->v1->x;
-	p2 = tmbox[BOXLEFT] < ld->v1->x;
-	if (ld->dy < 0)
-	{
-	    p1 ^= 1;
-	    p2 ^= 1;
-	}
-	break;
-	
-      case ST_POSITIVE:
-	p1 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXTOP], ld);
-	p2 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXBOTTOM], ld);
-	break;
-	
-      case ST_NEGATIVE:
-	p1 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXTOP], ld);
-	p2 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXBOTTOM], ld);
-	break;
+    case ST_HORIZONTAL:
+        p1 = tmbox[BOXTOP] > ld->v1->y;
+        p2 = tmbox[BOXBOTTOM] > ld->v1->y;
+        if (ld->dx < 0)
+        {
+            p1 ^= 1;
+            p2 ^= 1;
+        }
+        break;
+
+    case ST_VERTICAL:
+        p1 = tmbox[BOXRIGHT] < ld->v1->x;
+        p2 = tmbox[BOXLEFT] < ld->v1->x;
+        if (ld->dy < 0)
+        {
+            p1 ^= 1;
+            p2 ^= 1;
+        }
+        break;
+
+    case ST_POSITIVE:
+        p1 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXTOP], ld);
+        p2 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXBOTTOM], ld);
+        break;
+
+    case ST_NEGATIVE:
+        p1 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXTOP], ld);
+        p2 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXBOTTOM], ld);
+        break;
     }
 
     if (p1 == p2)
-	return p1;
+        return p1;
     return -1;
 }
 
@@ -160,48 +165,50 @@
 // P_PointOnDivlineSide
 // Returns 0 or 1.
 //
+// [STRIFE] Verified unmodified
+//
 int
 P_PointOnDivlineSide
-( fixed_t	x,
-  fixed_t	y,
-  divline_t*	line )
+( fixed_t       x,
+  fixed_t       y,
+  divline_t*    line )
 {
-    fixed_t	dx;
-    fixed_t	dy;
-    fixed_t	left;
-    fixed_t	right;
-	
+    fixed_t dx;
+    fixed_t dy;
+    fixed_t left;
+    fixed_t right;
+
     if (!line->dx)
     {
-	if (x <= line->x)
-	    return line->dy > 0;
-	
-	return line->dy < 0;
+        if (x <= line->x)
+            return line->dy > 0;
+
+        return line->dy < 0;
     }
     if (!line->dy)
     {
-	if (y <= line->y)
-	    return line->dx < 0;
+        if (y <= line->y)
+            return line->dx < 0;
 
-	return line->dx > 0;
+        return line->dx > 0;
     }
-	
+
     dx = (x - line->x);
     dy = (y - line->y);
-	
+
     // try to quickly decide by looking at sign bits
     if ( (line->dy ^ line->dx ^ dx ^ dy)&0x80000000 )
     {
-	if ( (line->dy ^ dx) & 0x80000000 )
-	    return 1;		// (left is negative)
-	return 0;
+        if ( (line->dy ^ dx) & 0x80000000 )
+            return 1;		// (left is negative)
+        return 0;
     }
-	
+
     left = FixedMul ( line->dy>>8, dx>>8 );
     right = FixedMul ( dy>>8 , line->dx>>8 );
-	
+
     if (right < left)
-	return 0;		// front side
+        return 0;		// front side
     return 1;			// back side
 }
 
@@ -230,25 +237,27 @@
 // This is only called by the addthings
 // and addlines traversers.
 //
+// [STRIFE] Verified unmodified
+//
 fixed_t
 P_InterceptVector
-( divline_t*	v2,
-  divline_t*	v1 )
+( divline_t*    v2,
+  divline_t*    v1 )
 {
 #if 1
-    fixed_t	frac;
-    fixed_t	num;
-    fixed_t	den;
-	
+    fixed_t frac;
+    fixed_t num;
+    fixed_t den;
+
     den = FixedMul (v1->dy>>8,v2->dx) - FixedMul(v1->dx>>8,v2->dy);
 
     if (den == 0)
-	return 0;
-    //	I_Error ("P_InterceptVector: parallel");
-    
+        return 0;
+    //  I_Error ("P_InterceptVector: parallel");
+
     num =
-	FixedMul ( (v1->x - v2->x)>>8 ,v1->dy )
-	+FixedMul ( (v2->y - v1->y)>>8, v1->dx );
+        FixedMul ( (v1->x - v2->x)>>8 ,v1->dy )
+        +FixedMul ( (v2->y - v1->y)>>8, v1->dx );
 
     frac = FixedDiv (num , den);
 
@@ -294,6 +303,8 @@
 // through a two sided line.
 // OPTIMIZE: keep this precalculated
 //
+// [STRIFE] Verified unmodified
+//
 fixed_t opentop;
 fixed_t openbottom;
 fixed_t openrange;
@@ -302,35 +313,35 @@
 
 void P_LineOpening (line_t* linedef)
 {
-    sector_t*	front;
-    sector_t*	back;
-	
+    sector_t*   front;
+    sector_t*   back;
+
     if (linedef->sidenum[1] == -1)
     {
-	// single sided line
-	openrange = 0;
-	return;
+        // single sided line
+        openrange = 0;
+        return;
     }
-	 
+
     front = linedef->frontsector;
     back = linedef->backsector;
-	
+
     if (front->ceilingheight < back->ceilingheight)
-	opentop = front->ceilingheight;
+        opentop = front->ceilingheight;
     else
-	opentop = back->ceilingheight;
+        opentop = back->ceilingheight;
 
     if (front->floorheight > back->floorheight)
     {
-	openbottom = front->floorheight;
-	lowfloor = back->floorheight;
+        openbottom = front->floorheight;
+        lowfloor = back->floorheight;
     }
     else
     {
-	openbottom = back->floorheight;
-	lowfloor = front->floorheight;
+        openbottom = back->floorheight;
+        lowfloor = front->floorheight;
     }
-	
+
     openrange = opentop - openbottom;
 }
 
@@ -347,44 +358,46 @@
 // lookups maintaining lists ot things inside
 // these structures need to be updated.
 //
+// [STRIFE] Verified unmodified
+//
 void P_UnsetThingPosition (mobj_t* thing)
 {
-    int		blockx;
-    int		blocky;
+    int     blockx;
+    int     blocky;
 
     if ( ! (thing->flags & MF_NOSECTOR) )
     {
-	// inert things don't need to be in blockmap?
-	// unlink from subsector
-	if (thing->snext)
-	    thing->snext->sprev = thing->sprev;
+        // inert things don't need to be in blockmap?
+        // unlink from subsector
+        if (thing->snext)
+            thing->snext->sprev = thing->sprev;
 
-	if (thing->sprev)
-	    thing->sprev->snext = thing->snext;
-	else
-	    thing->subsector->sector->thinglist = thing->snext;
+        if (thing->sprev)
+            thing->sprev->snext = thing->snext;
+        else
+            thing->subsector->sector->thinglist = thing->snext;
     }
-	
+
     if ( ! (thing->flags & MF_NOBLOCKMAP) )
     {
-	// inert things don't need to be in blockmap
-	// unlink from block map
-	if (thing->bnext)
-	    thing->bnext->bprev = thing->bprev;
-	
-	if (thing->bprev)
-	    thing->bprev->bnext = thing->bnext;
-	else
-	{
-	    blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
-	    blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
+        // inert things don't need to be in blockmap
+        // unlink from block map
+        if (thing->bnext)
+            thing->bnext->bprev = thing->bprev;
 
-	    if (blockx>=0 && blockx < bmapwidth
-		&& blocky>=0 && blocky <bmapheight)
-	    {
-		blocklinks[blocky*bmapwidth+blockx] = thing->bnext;
-	    }
-	}
+        if (thing->bprev)
+            thing->bprev->bnext = thing->bnext;
+        else
+        {
+            blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
+            blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
+
+            if (blockx>=0 && blockx < bmapwidth
+                && blocky>=0 && blocky <bmapheight)
+            {
+                blocklinks[blocky*bmapwidth+blockx] = thing->bnext;
+            }
+        }
     }
 }
 
@@ -395,60 +408,62 @@
 // based on it's x y.
 // Sets thing->subsector properly
 //
+// [STRIFE] Verified unmodified
+//
 void
 P_SetThingPosition (mobj_t* thing)
 {
-    subsector_t*	ss;
-    sector_t*		sec;
-    int			blockx;
-    int			blocky;
-    mobj_t**		link;
+    subsector_t*    ss;
+    sector_t*       sec;
+    int             blockx;
+    int             blocky;
+    mobj_t**        link;
 
-    
+
     // link into subsector
     ss = R_PointInSubsector (thing->x,thing->y);
     thing->subsector = ss;
-    
+
     if ( ! (thing->flags & MF_NOSECTOR) )
     {
-	// invisible things don't go into the sector links
-	sec = ss->sector;
-	
-	thing->sprev = NULL;
-	thing->snext = sec->thinglist;
+        // invisible things don't go into the sector links
+        sec = ss->sector;
 
-	if (sec->thinglist)
-	    sec->thinglist->sprev = thing;
+        thing->sprev = NULL;
+        thing->snext = sec->thinglist;
 
-	sec->thinglist = thing;
+        if (sec->thinglist)
+            sec->thinglist->sprev = thing;
+
+        sec->thinglist = thing;
     }
 
-    
+
     // link into blockmap
     if ( ! (thing->flags & MF_NOBLOCKMAP) )
     {
-	// inert things don't need to be in blockmap		
-	blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
-	blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
+        // inert things don't need to be in blockmap
+        blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT;
+        blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT;
 
-	if (blockx>=0
-	    && blockx < bmapwidth
-	    && blocky>=0
-	    && blocky < bmapheight)
-	{
-	    link = &blocklinks[blocky*bmapwidth+blockx];
-	    thing->bprev = NULL;
-	    thing->bnext = *link;
-	    if (*link)
-		(*link)->bprev = thing;
+        if (blockx>=0
+            && blockx < bmapwidth
+            && blocky>=0
+            && blocky < bmapheight)
+        {
+            link = &blocklinks[blocky*bmapwidth+blockx];
+            thing->bprev = NULL;
+            thing->bnext = *link;
+            if (*link)
+                (*link)->bprev = thing;
 
-	    *link = thing;
-	}
-	else
-	{
-	    // thing is off the map
-	    thing->bnext = thing->bprev = NULL;
-	}
+            *link = thing;
+        }
+        else
+        {
+            // thing is off the map
+            thing->bnext = thing->bprev = NULL;
+        }
     }
 }
 
@@ -485,9 +500,9 @@
     line_t*     ld;
 
     if (x<0
-        || y<0
-        || x>=bmapwidth
-        || y>=bmapheight)
+     || y<0
+     || x>=bmapwidth
+     || y>=bmapheight)
     {
         return true;
     }
@@ -518,29 +533,31 @@
 //
 // P_BlockThingsIterator
 //
+// [STRIFE] Verified unmodified
+//
 boolean
 P_BlockThingsIterator
-( int			x,
-  int			y,
+( int           x,
+  int           y,
   boolean(*func)(mobj_t*) )
 {
-    mobj_t*		mobj;
-	
+    mobj_t*     mobj;
+
     if ( x<0
-	 || y<0
-	 || x>=bmapwidth
-	 || y>=bmapheight)
+      || y<0
+      || x>=bmapwidth
+      || y>=bmapheight)
     {
-	return true;
+        return true;
     }
-    
 
+
     for (mobj = blocklinks[y*bmapwidth+x] ;
-	 mobj ;
-	 mobj = mobj->bnext)
+         mobj ;
+         mobj = mobj->bnext)
     {
-	if (!func( mobj ) )
-	    return false;
+        if (!func( mobj ) )
+            return false;
     }
     return true;
 }
@@ -569,55 +586,66 @@
 // are on opposite sides of the trace.
 // Returns true if earlyout and a solid line hit.
 //
+// haleyjd 20110204 [STRIFE]: Added Rogue's fix for intercepts overflows
+//
 boolean
 PIT_AddLineIntercepts (line_t* ld)
 {
-    int			s1;
-    int			s2;
-    fixed_t		frac;
-    divline_t		dl;
-	
+    int         s1;
+    int         s2;
+    fixed_t     frac;
+    divline_t   dl;
+
     // avoid precision problems with two routines
     if ( trace.dx > FRACUNIT*16
-	 || trace.dy > FRACUNIT*16
-	 || trace.dx < -FRACUNIT*16
-	 || trace.dy < -FRACUNIT*16)
+      || trace.dy > FRACUNIT*16
+      || trace.dx < -FRACUNIT*16
+      || trace.dy < -FRACUNIT*16)
     {
-	s1 = P_PointOnDivlineSide (ld->v1->x, ld->v1->y, &trace);
-	s2 = P_PointOnDivlineSide (ld->v2->x, ld->v2->y, &trace);
+        s1 = P_PointOnDivlineSide (ld->v1->x, ld->v1->y, &trace);
+        s2 = P_PointOnDivlineSide (ld->v2->x, ld->v2->y, &trace);
     }
     else
     {
-	s1 = P_PointOnLineSide (trace.x, trace.y, ld);
-	s2 = P_PointOnLineSide (trace.x+trace.dx, trace.y+trace.dy, ld);
+        s1 = P_PointOnLineSide (trace.x, trace.y, ld);
+        s2 = P_PointOnLineSide (trace.x+trace.dx, trace.y+trace.dy, ld);
     }
-    
+
     if (s1 == s2)
-	return true;	// line isn't crossed
-    
+        return true;    // line isn't crossed
+
     // hit the line
     P_MakeDivline (ld, &dl);
     frac = P_InterceptVector (&trace, &dl);
 
     if (frac < 0)
-	return true;	// behind source
-	
+        return true;    // behind source
+
     // try to early out the check
     if (earlyout
-	&& frac < FRACUNIT
-	&& !ld->backsector)
+        && frac < FRACUNIT
+        && !ld->backsector)
     {
-	return false;	// stop checking
+        return false;   // stop checking
     }
-    
-	
+
+
     intercept_p->frac = frac;
     intercept_p->isaline = true;
     intercept_p->d.line = ld;
-    InterceptsOverrun(intercept_p - intercepts, intercept_p);
     intercept_p++;
 
-    return true;	// continue
+    // haleyjd 20110204 [STRIFE]
+    // Evidently Rogue had trouble with intercepts overflows during
+    // development, as they added this check here which will stop adding
+    // intercepts if the array would be overflown.
+    if(intercept_p <= &intercepts[MAXINTERCEPTS_ORIGINAL-2])
+        return true;    // continue
+    else
+        return false;
+
+    // [STRIFE] Not needed?
+    //InterceptsOverrun(intercept_p - intercepts, intercept_p);
 }
 
 
@@ -627,63 +655,71 @@
 //
 boolean PIT_AddThingIntercepts (mobj_t* thing)
 {
-    fixed_t		x1;
-    fixed_t		y1;
-    fixed_t		x2;
-    fixed_t		y2;
-    
-    int			s1;
-    int			s2;
-    
-    boolean		tracepositive;
+    fixed_t     x1;
+    fixed_t     y1;
+    fixed_t     x2;
+    fixed_t     y2;
 
-    divline_t		dl;
-    
-    fixed_t		frac;
-	
+    int         s1;
+    int         s2;
+
+    boolean     tracepositive;
+
+    divline_t   dl;
+
+    fixed_t     frac;
+
     tracepositive = (trace.dx ^ trace.dy)>0;
-		
+
     // check a corner to corner crossection for hit
     if (tracepositive)
     {
-	x1 = thing->x - thing->radius;
-	y1 = thing->y + thing->radius;
-		
-	x2 = thing->x + thing->radius;
-	y2 = thing->y - thing->radius;			
+        x1 = thing->x - thing->radius;
+        y1 = thing->y + thing->radius;
+
+        x2 = thing->x + thing->radius;
+        y2 = thing->y - thing->radius;
     }
     else
     {
-	x1 = thing->x - thing->radius;
-	y1 = thing->y - thing->radius;
-		
-	x2 = thing->x + thing->radius;
-	y2 = thing->y + thing->radius;			
+        x1 = thing->x - thing->radius;
+        y1 = thing->y - thing->radius;
+
+        x2 = thing->x + thing->radius;
+        y2 = thing->y + thing->radius;
     }
-    
+
     s1 = P_PointOnDivlineSide (x1, y1, &trace);
     s2 = P_PointOnDivlineSide (x2, y2, &trace);
 
     if (s1 == s2)
-	return true;		// line isn't crossed
-	
+        return true;        // line isn't crossed
+
     dl.x = x1;
     dl.y = y1;
     dl.dx = x2-x1;
     dl.dy = y2-y1;
-    
+
     frac = P_InterceptVector (&trace, &dl);
 
     if (frac < 0)
-	return true;		// behind source
+        return true;        // behind source
 
     intercept_p->frac = frac;
     intercept_p->isaline = false;
     intercept_p->d.thing = thing;
-    InterceptsOverrun(intercept_p - intercepts, intercept_p);
+    
     intercept_p++;
+    
+    // haleyjd 20110204 [STRIFE]: As above, protection against intercepts
+    // overflows, courtesy of Rogue Software.
+    if(intercept_p <= &intercepts[MAXINTERCEPTS_ORIGINAL-2])
+        return true;            // keep going
+    else
+        return false;
 
-    return true;		// keep going
+    // haleyjd [STRIFE]: Not needed?
+    //InterceptsOverrun(intercept_p - intercepts, intercept_p);
 }
 
 
@@ -699,49 +735,49 @@
 ( traverser_t	func,
   fixed_t	maxfrac )
 {
-    int			count;
-    fixed_t		dist;
-    intercept_t*	scan;
-    intercept_t*	in;
-	
+    int             count;
+    fixed_t         dist;
+    intercept_t*    scan;
+    intercept_t*    in;
+
     count = intercept_p - intercepts;
-    
-    in = 0;			// shut up compiler warning
-	
+
+    in = 0;         // shut up compiler warning
+
     while (count--)
     {
-	dist = INT_MAX;
-	for (scan = intercepts ; scan<intercept_p ; scan++)
-	{
-	    if (scan->frac < dist)
-	    {
-		dist = scan->frac;
-		in = scan;
-	    }
-	}
-	
-	if (dist > maxfrac)
-	    return true;	// checked everything in range		
+        dist = INT_MAX;
+        for (scan = intercepts ; scan<intercept_p ; scan++)
+        {
+            if (scan->frac < dist)
+            {
+                dist = scan->frac;
+                in = scan;
+            }
+        }
 
+        if (dist > maxfrac)
+            return true;    // checked everything in range
+
 #if 0  // UNUSED
-    {
-	// don't check these yet, there may be others inserted
-	in = scan = intercepts;
-	for ( scan = intercepts ; scan<intercept_p ; scan++)
-	    if (scan->frac > maxfrac)
-		*in++ = *scan;
-	intercept_p = in;
-	return false;
-    }
+        {
+            // don't check these yet, there may be others inserted
+            in = scan = intercepts;
+            for ( scan = intercepts ; scan<intercept_p ; scan++)
+                if (scan->frac > maxfrac)
+                    *in++ = *scan;
+            intercept_p = in;
+            return false;
+        }
 #endif
 
         if ( !func (in) )
-	    return false;	// don't bother going farther
+            return false;   // don't bother going farther
 
-	in->frac = INT_MAX;
+        in->frac = INT_MAX;
     }
-	
-    return true;		// everything was traversed
+
+    return true;            // everything was traversed
 }
 
 extern fixed_t bulletslope;
@@ -766,6 +802,12 @@
 // playerstarts, which is effectively an array of 16-bit integers and
 // must be treated differently.
 
+// haleyjd 20110204: NB: This array has *not* been updated for Strife,
+// because Strife has protection against intercepts overflows. The memory
+// layout of the 1.2 and 1.31 EXEs is radically different with respect
+// to this area of the BSS segment, so it would have to be redone entirely
+// if it were needed.
+
 static intercepts_overrun_t intercepts_overrun[] =
 {
     {4,   NULL,                          false},
@@ -873,46 +915,48 @@
 // Returns true if the traverser function returns true
 // for all lines.
 //
+// [STRIFE] Verified unmodified
+//
 boolean
 P_PathTraverse
-( fixed_t		x1,
-  fixed_t		y1,
-  fixed_t		x2,
-  fixed_t		y2,
-  int			flags,
+( fixed_t       x1,
+  fixed_t       y1,
+  fixed_t       x2,
+  fixed_t       y2,
+  int           flags,
   boolean (*trav) (intercept_t *))
 {
-    fixed_t	xt1;
-    fixed_t	yt1;
-    fixed_t	xt2;
-    fixed_t	yt2;
+    fixed_t xt1;
+    fixed_t yt1;
+    fixed_t xt2;
+    fixed_t yt2;
     
-    fixed_t	xstep;
-    fixed_t	ystep;
+    fixed_t xstep;
+    fixed_t ystep;
     
-    fixed_t	partial;
+    fixed_t partial;
     
-    fixed_t	xintercept;
-    fixed_t	yintercept;
+    fixed_t xintercept;
+    fixed_t yintercept;
     
-    int		mapx;
-    int		mapy;
+    int     mapx;
+    int     mapy;
     
-    int		mapxstep;
-    int		mapystep;
+    int     mapxstep;
+    int     mapystep;
 
-    int		count;
-		
+    int     count;
+
     earlyout = flags & PT_EARLYOUT;
-		
+
     validcount++;
     intercept_p = intercepts;
-	
+
     if ( ((x1-bmaporgx)&(MAPBLOCKSIZE-1)) == 0)
-	x1 += FRACUNIT;	// don't side exactly on a line
-    
+        x1 += FRACUNIT;	// don't side exactly on a line
+
     if ( ((y1-bmaporgy)&(MAPBLOCKSIZE-1)) == 0)
-	y1 += FRACUNIT;	// don't side exactly on a line
+        y1 += FRACUNIT;	// don't side exactly on a line
 
     trace.x = x1;
     trace.y = y1;
@@ -931,83 +975,83 @@
 
     if (xt2 > xt1)
     {
-	mapxstep = 1;
-	partial = FRACUNIT - ((x1>>MAPBTOFRAC)&(FRACUNIT-1));
-	ystep = FixedDiv (y2-y1,abs(x2-x1));
+        mapxstep = 1;
+        partial = FRACUNIT - ((x1>>MAPBTOFRAC)&(FRACUNIT-1));
+        ystep = FixedDiv (y2-y1,abs(x2-x1));
     }
     else if (xt2 < xt1)
     {
-	mapxstep = -1;
-	partial = (x1>>MAPBTOFRAC)&(FRACUNIT-1);
-	ystep = FixedDiv (y2-y1,abs(x2-x1));
+        mapxstep = -1;
+        partial = (x1>>MAPBTOFRAC)&(FRACUNIT-1);
+        ystep = FixedDiv (y2-y1,abs(x2-x1));
     }
     else
     {
-	mapxstep = 0;
-	partial = FRACUNIT;
-	ystep = 256*FRACUNIT;
+        mapxstep = 0;
+        partial = FRACUNIT;
+        ystep = 256*FRACUNIT;
     }	
 
     yintercept = (y1>>MAPBTOFRAC) + FixedMul (partial, ystep);
 
-	
+
     if (yt2 > yt1)
     {
-	mapystep = 1;
-	partial = FRACUNIT - ((y1>>MAPBTOFRAC)&(FRACUNIT-1));
-	xstep = FixedDiv (x2-x1,abs(y2-y1));
+        mapystep = 1;
+        partial = FRACUNIT - ((y1>>MAPBTOFRAC)&(FRACUNIT-1));
+        xstep = FixedDiv (x2-x1,abs(y2-y1));
     }
     else if (yt2 < yt1)
     {
-	mapystep = -1;
-	partial = (y1>>MAPBTOFRAC)&(FRACUNIT-1);
-	xstep = FixedDiv (x2-x1,abs(y2-y1));
+        mapystep = -1;
+        partial = (y1>>MAPBTOFRAC)&(FRACUNIT-1);
+        xstep = FixedDiv (x2-x1,abs(y2-y1));
     }
     else
     {
-	mapystep = 0;
-	partial = FRACUNIT;
-	xstep = 256*FRACUNIT;
+        mapystep = 0;
+        partial = FRACUNIT;
+        xstep = 256*FRACUNIT;
     }	
     xintercept = (x1>>MAPBTOFRAC) + FixedMul (partial, xstep);
-    
+
     // Step through map blocks.
     // Count is present to prevent a round off error
     // from skipping the break.
     mapx = xt1;
     mapy = yt1;
-	
+
     for (count = 0 ; count < 64 ; count++)
     {
-	if (flags & PT_ADDLINES)
-	{
-	    if (!P_BlockLinesIterator (mapx, mapy,PIT_AddLineIntercepts))
-		return false;	// early out
-	}
-	
-	if (flags & PT_ADDTHINGS)
-	{
-	    if (!P_BlockThingsIterator (mapx, mapy,PIT_AddThingIntercepts))
-		return false;	// early out
-	}
-		
-	if (mapx == xt2
-	    && mapy == yt2)
-	{
-	    break;
-	}
-	
-	if ( (yintercept >> FRACBITS) == mapy)
-	{
-	    yintercept += ystep;
-	    mapx += mapxstep;
-	}
-	else if ( (xintercept >> FRACBITS) == mapx)
-	{
-	    xintercept += xstep;
-	    mapy += mapystep;
-	}
-		
+        if (flags & PT_ADDLINES)
+        {
+            if (!P_BlockLinesIterator (mapx, mapy,PIT_AddLineIntercepts))
+                return false;   // early out
+        }
+
+        if (flags & PT_ADDTHINGS)
+        {
+            if (!P_BlockThingsIterator (mapx, mapy,PIT_AddThingIntercepts))
+                return false;   // early out
+        }
+
+        if (mapx == xt2
+         && mapy == yt2)
+        {
+            break;
+        }
+
+        if ( (yintercept >> FRACBITS) == mapy)
+        {
+            yintercept += ystep;
+            mapx += mapxstep;
+        }
+        else if ( (xintercept >> FRACBITS) == mapx)
+        {
+            xintercept += xstep;
+            mapy += mapystep;
+        }
+
     }
     // go through the sorted list
     return P_TraverseIntercepts ( trav, FRACUNIT );