diff -r d9482ae4a8b5 src/am_map.cpp
--- a/src/am_map.cpp	Sun Oct 13 13:23:09 2013 +0300
+++ b/src/am_map.cpp	Sun Oct 13 23:44:04 2013 +0300
@@ -321,6 +321,17 @@
 #define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))
 
 
+// [Dusk] Begin player spawn spot vector
+#define R MAPUNIT
+mline_t playerspawnspot_star[] = {
+	{ { -R, 0 }, { R, 0 } }, // horizontal line
+	{ { 0, -R }, { 0, R } }, // vertical line
+	{ { -R, -R }, { R, R } }, // nw/se diagonal line
+	{ { -R, R }, { R, -R } }, // sw/ne diagonal line
+};
+#undef R
+#define NUMPLAYERSPAWNSPOTLINES (sizeof(playerspawnspot_star)/sizeof(mline_t))
+// [Dusk] End player spawn spot vector
 
 EXTERN_CVAR (Bool, sv_cheats)
 CUSTOM_CVAR (Int, am_cheat, 0, 0)
@@ -332,6 +343,31 @@
 	}
 }
 
+// [Dusk]
+CUSTOM_CVAR (Bool, am_showstarts, false, 0)
+{
+	if ( NETWORK_InClientMode() && !sv_cheats && self )
+	{
+		Printf( "%s cannot be set in network games without sv_cheats.\n", self.GetName() );
+		self = 0;
+	}
+}
+
+// [Dusk] Struct type for AM_drawStarts
+struct AMSpawnSpotStar
+{
+	AMColor color;
+	fixed_t x, y;
+	angle_t angle;
+	
+	void CalibrateFromMapThing( FMapThing* mthing )
+	{
+		x = mthing->x >> FRACTOMAPBITS;
+		y = mthing->y >> FRACTOMAPBITS;
+		angle = mthing->angle;
+	}
+};
+
 static int 	grid = 0;
 
 static int 	leveljuststarted = 1; 	// kluge until AM_LevelInit() is called
@@ -2072,6 +2108,94 @@
 
 //=============================================================================
 //
+// [Dusk] Helper for AM_drawStarts
+//
+//=============================================================================
+void AM_collectStartStars( const TArray<FMapThing>& starts, TArray<AMSpawnSpotStar>& stars, const AMColor& color )
+{
+	for ( size_t i = 0; i < starts.Size(); ++i )
+	{
+		AMSpawnSpotStar star;
+		FMapThing* mthing = &starts[i];
+		star.CalibrateFromMapThing( mthing );
+		star.color = color;
+		stars.Push( star );
+	}
+}
+
+
+//=============================================================================
+//
+// [Dusk] Draws the starts of players. Also draws terminator/possession starts
+//        and invasion starts.
+//
+//=============================================================================
+void AM_drawStarts( )
+{
+	if ( !am_showstarts )
+		return;
+
+	TArray<AMSpawnSpotStar> stars;
+	AMColor color;
+
+	// Add singleplayer/cooperative starts, in light green
+	{
+		AMSpawnSpotStar star;
+		star.color.FromRGB( 64, 255, 64 );
+
+		for ( int i = 0; i < MAXPLAYERS; ++i )
+		{
+			for ( size_t j = 0; j < AllPlayerStarts[i].Size(); ++j )
+			{
+				FMapThing* mthing = &AllPlayerStarts[i][j];
+				star.CalibrateFromMapThing( mthing );
+				stars.Push( star );
+			}
+		}
+	}
+
+	// Deathmatch starts, in dark green
+	color.FromRGB( 16, 64, 16 );
+	AM_collectStartStars( deathmatchstarts, stars, color );
+
+	// Terminator starts, in orange
+	color.FromRGB( 255, 128, 0 );
+	AM_collectStartStars( TerminatorStarts, stars, color );
+
+	// Hellstone starts, in black
+	color.FromRGB( 0, 0, 0 );
+	AM_collectStartStars( PossessionStarts, stars, color );
+
+	// Invasion starts, in magenta
+	color.FromRGB( 255, 0, 255 );
+	AM_collectStartStars( GenericInvasionStarts, stars, color );
+
+	// Team starts, in their respective team color
+	for ( size_t i = 0; i < teams.Size(); ++i )
+	{
+		AMSpawnSpotStar star;
+		LONG lColor = teams[i].lPlayerColor;
+		star.color.FromRGB( RPART( lColor ), GPART( lColor ), BPART( lColor ));
+
+		for ( size_t j = 0; j < teams[i].TeamStarts.Size(); ++j )
+		{
+			FMapThing* mthing = &teams[i].TeamStarts[j];
+			star.CalibrateFromMapThing( mthing );
+			stars.Push( star );
+		}
+	}
+
+	// Now, draw all gathered starts as stars on the map.
+	for ( size_t i = 0; i < stars.Size(); ++i )
+	{
+		AMSpawnSpotStar* star = &stars[i];
+		AM_drawLineCharacter( playerspawnspot_star, NUMPLAYERSPAWNSPOTLINES, 16 << MAPBITS,
+			star->angle, star->color, star->x, star->y );
+	}
+}
+
+//=============================================================================
+//
 //
 //
 //=============================================================================
@@ -2128,6 +2252,9 @@
 
 	AM_drawAuthorMarkers();
 
+	// [Dusk]
+	AM_drawStarts( );
+
 	if (!viewactive)
 		AM_drawCrosshair(XHairColor);
 
diff -r d9482ae4a8b5 src/cl_main.cpp
--- a/src/cl_main.cpp	Sun Oct 13 13:23:09 2013 +0300
+++ b/src/cl_main.cpp	Sun Oct 13 23:44:04 2013 +0300
@@ -137,6 +137,7 @@
 EXTERN_CVAR( Float, turbo )
 EXTERN_CVAR( Float, sv_gravity )
 EXTERN_CVAR( Float, sv_aircontrol )
+EXTERN_CVAR( Bool, am_showstarts )
 
 //*****************************************************************************
 //	CONSOLE COMMANDS/VARIABLES
@@ -605,6 +606,7 @@
 		Val.Bool = false;
 		sv_cheats.ForceSet( Val, CVAR_Bool );
 		am_cheat = 0;
+		am_showstarts = 0;
 
 		// Make sure our visibility is normal.
 		R_SetVisibility( 8.0f );
@@ -7919,6 +7921,8 @@
 	sv_cheats.ForceSet( Value, CVAR_Int );
 	// [BB] This ensures that am_cheat respects the sv_cheats value we just set.
 	am_cheat = am_cheat;
+	// [Dusk] beep boop
+	am_showstarts = am_showstarts;
 
 	// Read in, and set the value for sv_fastweapons.
 	Value.Int = NETWORK_ReadByte( pByteStream );
@@ -12206,6 +12210,7 @@
 	Val.Bool = false;
 	sv_cheats.ForceSet( Val, CVAR_Bool );
 	am_cheat = 0;
+	am_showstarts = 0;
 
 	// Make sure our visibility is normal.
 	R_SetVisibility( 8.0f );
@@ -12302,6 +12307,7 @@
 	Val.Bool = false;
 	sv_cheats.ForceSet( Val, CVAR_Bool );
 	am_cheat = 0;
+	am_showstarts = 0;
 
 	// Make sure our visibility is normal.
 	R_SetVisibility( 8.0f );
diff -r d9482ae4a8b5 src/p_buildmap.cpp
--- a/src/p_buildmap.cpp	Sun Oct 13 13:23:09 2013 +0300
+++ b/src/p_buildmap.cpp	Sun Oct 13 23:44:04 2013 +0300
@@ -349,7 +349,7 @@
 		data += sizeof(spritetype);
 		if (bspr[i].extra > 0)	// copy Xsprite
 		{
-			assert(sizeof Xsprite == 56);
+			assert(sizeof (Xsprite) == 56);
 			memcpy(&xspr[i], data, sizeof(Xsprite));
 			data += sizeof(Xsprite);
 		}
