diff -durN 63/src/thingdef.cpp 63a/src/thingdef.cpp
--- 63/src/thingdef.cpp	Tue Feb 10 14:56:34 2004
+++ 63a/src/thingdef.cpp	Mon Jun 07 19:36:51 2004
@@ -200,15 +200,15 @@
 
 static const char * flag4names[]=
 {
-	"**",					// NOHATEPLAYERS
-	"*QUICKTORETALIATE",
-	"*NOICEDEATH",
-	"**",					// BOSSDEATH
-	"*RANDOMIZE",
-	"**",					// NOSKIN
-	"*FIXMAPTHINGPOS",
-	"*ACTLIKEBRIDGE",
-	"*STRIFEDAMAGE",
+	"*",					// NOHATEPLAYERS
+	"QUICKTORETALIATE",
+	"NOICEDEATH",
+	"*",					// BOSSDEATH
+	"RANDOMIZE",
+	"*",					// NOSKIN
+	"FIXMAPTHINGPOS",
+	"ACTLIKEBRIDGE",
+	"STRIFEDAMAGE",
 	NULL
 };
 
@@ -276,6 +276,7 @@
 	fixed_t SpawnHeight;
 	fixed_t Spawnofs_XY;
 	angle_t Angle;
+	bool aimparallel;
 };
 
 TArray<FMissileAttack> AttackList;
@@ -515,8 +516,10 @@
 void A_CustomMissile(AActor * self)
 {
 	int index=self->state->GetMisc2()+256*self->state->GetMisc1();
+	AActor * targ;
+	AActor * missile;
 
-	if (index>=0 && index<AttackList.Size())
+	if (self->target && index>=0 && index<AttackList.Size())
 	{
 		FMissileAttack * att=&AttackList[index];
 
@@ -524,23 +527,52 @@
 		if (ti) 
 		{
 			angle_t ang = (self->angle - ANGLE_90) >> ANGLETOFINESHIFT;
-			fixed_t x = self->x + att->Spawnofs_XY * finecosine[ang];
-			fixed_t y = self->y + att->Spawnofs_XY * finesine[ang];
-
-			// same adjustment as above - for better aiming!
-			self->z+=att->SpawnHeight-32*FRACUNIT;
-			AActor * missile = P_SpawnMissileXYZ(x,y,self->z+32*FRACUNIT, self, self->target, ti);
-			self->z-=att->SpawnHeight-32*FRACUNIT;
+			fixed_t x = att->Spawnofs_XY * finecosine[ang];
+			fixed_t y = att->Spawnofs_XY * finesine[ang];
+			fixed_t z = att->SpawnHeight-32*FRACUNIT;
 
-			missile->angle += att->Angle;
-			ang = missile->angle >> ANGLETOFINESHIFT;
-			missile->momx = FixedMul (missile->Speed, finecosine[ang]);
-			missile->momy = FixedMul (missile->Speed, finesine[ang]);
+			if (!att->aimparallel)
+			{
+				// same adjustment as above (in all 3 directions this time) - for better aiming!
+				self->x+=x;
+				self->y+=y;
+				self->z+=z;
+				missile = P_SpawnMissile(self, self->target, ti);
+				self->x-=x;
+				self->y-=y;
+				self->z-=z;
+			}
+			else
+			{
+				missile = P_SpawnMissileXYZ(self->x+x, self->y+y, self->z+att->SpawnHeight, self, self->target, ti);
+			}
 
-			// automatic handling of seeker missiles
-			if (missile && missile->flags2&MF2_SEEKERMISSILE)
+			if (missile)
 			{
-				missile->tracer=self->target;
+				missile->angle += att->Angle;
+				ang = missile->angle >> ANGLETOFINESHIFT;
+				missile->momx = FixedMul (missile->Speed, finecosine[ang]);
+				missile->momy = FixedMul (missile->Speed, finesine[ang]);
+
+				// handle projectile shooting projectiles - track the
+				// links back to a real owner
+				if (self->flags & MF_MISSILE)
+				{
+					AActor * owner=self->target;
+					while (owner->flags&MF_MISSILE && owner->target) owner=owner->target;
+					targ=owner;
+					missile->target=owner;
+					// automatic handling of seeker missiles
+					if (self->flags2 & missile->flags2 & MF2_SEEKERMISSILE)
+					{
+						missile->tracer=self->tracer;
+					}
+				}
+				else if (missile->flags2&MF2_SEEKERMISSILE)
+				{
+					// automatic handling of seeker missiles
+					missile->tracer=self->target;
+				}
 			}
 		}
 	}
@@ -994,11 +1026,15 @@
 					att.Spawnofs_XY=sc_Number;
 					SC_MustGetStringName (",");
 					SC_MustGetNumber();
-					if (sc_Number<-90 || sc_Number>90)
+					att.Angle=sc_Number*ANGLE_1;
+
+					if (SC_TestToken(","))
 					{
-						SC_ScriptError("The fourth parameter of A_CustomMissile must be in the range [-90..90]");
+						SC_MustGetNumber();
+						att.aimparallel=!!sc_Number;
 					}
-					att.Angle=sc_Number*ANGLE_1;
+					else att.aimparallel = false;
+
 					SC_MustGetStringName (")");
 
 					int v=AttackList.Push(att);
diff -durN 63/src/version.h 63a/src/version.h
--- 63/src/version.h	Tue Feb 10 14:53:34 2004
+++ 63a/src/version.h	Mon Jun 07 10:38:32 2004
@@ -37,7 +37,7 @@
 // Lots of different representations for the version number
 enum { VERSION = 204 };
 #define STRVERSION "204"
-#define DOTVERSIONSTR "2.0.63"
+#define DOTVERSIONSTR "2.0.63a"
 #define GAMEVER (2*256+2)
 
 // SAVEVER is the version of the information stored in level snapshots.
Binary files 63/src/win32/zdoom.aps and 63a/src/win32/zdoom.aps differ
diff -durN 63/src/win32/zdoom.rc 63a/src/win32/zdoom.rc
--- 63/src/win32/zdoom.rc	Tue Feb 10 14:53:34 2004
+++ 63a/src/win32/zdoom.rc	Mon Jun 07 10:58:41 2004
@@ -134,7 +134,7 @@
 //
 
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,63,0
+ FILEVERSION 2,0,63,1
  PRODUCTVERSION 2,0,0,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
@@ -153,7 +153,7 @@
             VALUE "Comments", "Thanks to id Software for creating DOOM and then releasing the source code. Thanks also to TeamTNT for creating BOOM, which ZDoom is partially based on. Includes code based on the Cajun Bot 0.97 by Martin Collberg."
             VALUE "CompanyName", " "
             VALUE "FileDescription", "ZDoom"
-            VALUE "FileVersion", "2.0.63"
+            VALUE "FileVersion", "2.0.63a"
             VALUE "InternalName", "ZDoom"
             VALUE "LegalCopyright", "Copyright © 1993-1996, id Software & 1998-2004, Randy Heit"
             VALUE "LegalTrademarks", "Doom® is a Registered Trademark of id Software, Inc."
Binary files 63/src/zdoom.ncb and 63a/src/zdoom.ncb differ
Binary files 63/src/zdoom.suo and 63a/src/zdoom.suo differ
Binary files 63/zdoomd.exe and 63a/zdoomd.exe differ
