diff -r -Naur --ignore-space-change --ignore-all-space ../d2x.org/main/gameseg.c ./main/gameseg.c
--- ../d2x.org/main/gameseg.c	2003-11-08 07:38:44.000000000 +0100
+++ ./main/gameseg.c	2003-11-15 16:56:39.000000000 +0100
@@ -956,6 +956,9 @@
 //	to the routine...--MK, 01/17/96
 int	Doing_lighting_hack_flag=0;
 
+// make sure we don't end up in a infinite loop.
+int Trace_SegCalls = 0;
+
 //figure out what seg the given point is in, tracing through segments
 //returns segment number, or -1 if can't find segment
 int trace_segs(vms_vector *p0,int oldsegnum)
@@ -964,14 +967,21 @@
 	segment *seg;
 	fix side_dists[6];
 
-	Assert((oldsegnum <= Highest_segment_index) && (oldsegnum >= 0));
+	// check for infinite loop, if so just return -1
+	if (Trace_SegCalls > 1000) {
+		mprintf ((0,"trace_segs (gameseg.c) - Something went wrong - infinite loop\n"));
+		return 0;
+	}
+	Trace_SegCalls++;
 
+	Assert((oldsegnum <= Highest_segment_index) && (oldsegnum >= 0));
 
 	centermask = get_side_dists(p0,oldsegnum,side_dists);		//check old segment
 
-	if (centermask == 0)		//we're in the old segment
-
+	if (centermask == 0) {		//we're in the old segment
+		Trace_SegCalls--;
 		return oldsegnum;		//..say so
+	}
 
 	else {						//not in old seg.  trace through to find seg
 		int biggest_side;
@@ -998,16 +1008,18 @@
 
 				check = trace_segs(p0,seg->children[biggest_side]);	//trace into adjacent segment
 
-				if (check != -1)		//we've found a segment
+				if (check != -1) {		//we've found a segment
+					Trace_SegCalls--;
 					return check;	
 			}
+			}
 
 
 		} while (biggest_side!=-1);
 
+		Trace_SegCalls--;
 		return -1;		//we haven't found a segment
 	}
-
 }
 
 
