Index: p_mobj.c
===================================================================
RCS file: /cvsroot/chocolate-doom/chocolate-doom/src/p_mobj.c,v
retrieving revision 1.3
diff -u -r1.3 p_mobj.c
--- p_mobj.c	23 Jul 2005 17:46:19 -0000	1.3
+++ p_mobj.c	6 Oct 2005 22:55:57 -0000
@@ -931,7 +931,10 @@
 {
     mobj_t*	th;
     angle_t	an;
+    fixed_t     dest_x, dest_y;
     int		dist;
+    fixed_t     aheadfactor;
+    int i;
 
     th = P_SpawnMobj (source->x,
 		      source->y,
@@ -940,8 +943,30 @@
     if (th->info->seesound)
 	S_StartSound (th, th->info->seesound);
 
+    dist = P_AproxDistance (dest->x - source->x, dest->y - source->y);
+    dist = dist / th->info->speed;
+
+    if (dist < 1)
+	dist = 1;
+
+    th->momz = (dest->z - source->z) / dist;
+    
+    aheadfactor = 0;
+
+    for (i=0; i<4; ++i)
+    {
+        aheadfactor += (dist * (P_Random()-128)) * (FRACUNIT / (256 * 4));
+    }
+
+    aheadfactor += (dist * FRACUNIT) / 2;
+
+    aheadfactor = FixedMul(aheadfactor, 1.2 * FRACUNIT);
+
+    dest_x = dest->x + FixedMul(aheadfactor, dest->momx);
+    dest_y = dest->y + FixedMul(aheadfactor, dest->momy);
+    
     th->target = source;	// where it came from
-    an = R_PointToAngle2 (source->x, source->y, dest->x, dest->y);	
+    an = R_PointToAngle2 (source->x, source->y, dest_x, dest_y);	
 
     // fuzzy player
     if (dest->flags & MF_SHADOW)
@@ -952,13 +977,6 @@
     th->momx = FixedMul (th->info->speed, finecosine[an]);
     th->momy = FixedMul (th->info->speed, finesine[an]);
 	
-    dist = P_AproxDistance (dest->x - source->x, dest->y - source->y);
-    dist = dist / th->info->speed;
-
-    if (dist < 1)
-	dist = 1;
-
-    th->momz = (dest->z - source->z) / dist;
     P_CheckMissileSpawn (th);
 	
     return th;
