Index: p_mobj.c
===================================================================
--- p_mobj.c	(revision 2586)
+++ p_mobj.c	(working copy)
@@ -962,17 +962,42 @@
 {
     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,
 		      source->z + 4*8*FRACUNIT, type);
-    
+
     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)
@@ -983,13 +1008,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;
