diff --git a/src/k_kart.c b/src/k_kart.c
index 2a152162abf0116757c17868f0ce6cfc0d4fe74c..fa02449794a55942de7eca30ee4b5f4c69865cea 100644
--- a/src/k_kart.c
+++ b/src/k_kart.c
@@ -6166,6 +6166,12 @@ INT32 CHEK_Y;			// CHECK graphic
 INT32 MINI_X, MINI_Y;	// Minimap
 INT32 WANT_X, WANT_Y;	// Battle WANTED poster
 
+// This is messy AND looks horrible, but I really couldn't find any other magic trick for 4 player splitscreen garbage. Sorry.
+INT32 ITEM2_X, ITEM2_Y, ITEM3_X, ITEM3_Y, ITEM4_X, ITEM4_Y;
+INT32 LAPS2_X, LAPS2_Y, LAPS3_X, LAPS3_Y, LAPS4_X, LAPS4_Y;
+INT32 POSI2_X, POSI2_Y, POSI3_X, POSI3_Y, POSI4_X, POSI4_Y;
+
+
 static void K_initKartHUD(void)
 {
 	/*
@@ -6251,13 +6257,47 @@ static void K_initKartHUD(void)
 
 		if (splitscreen > 1)	// 3P/4P Small Splitscreen
 		{
+			// 1P (top left)
 			ITEM_X = -9;
 			ITEM_Y = -8;
 
 			LAPS_X = 3;
 			LAPS_Y = (BASEVIDHEIGHT/2)-13;
 
-			POSI_X = (BASEVIDWIDTH/2)-3;
+			POSI_X = 32;
+			POSI_Y = (BASEVIDHEIGHT/2)- 16;
+
+			// 2P (top right)
+			ITEM2_X = BASEVIDWIDTH-40;
+			ITEM2_Y = -8;
+
+			LAPS2_X = BASEVIDWIDTH-45;
+			LAPS2_Y = (BASEVIDHEIGHT/2)-13;
+
+			POSI2_X = BASEVIDWIDTH -9;
+			POSI2_Y = (BASEVIDHEIGHT/2)- 16;
+
+			// 3P (bottom left)
+			ITEM3_X = -9;
+			ITEM3_Y = (BASEVIDHEIGHT/2) -9;
+
+			LAPS3_X = 3;
+			LAPS3_Y = (BASEVIDHEIGHT)-13;
+
+			POSI3_X = 32;
+			POSI3_Y = (BASEVIDHEIGHT)- 16;
+
+			// 4P (bottom right)
+			ITEM4_X = BASEVIDWIDTH-40;
+			ITEM4_Y = (BASEVIDHEIGHT/2) -9;
+
+			LAPS4_X = BASEVIDWIDTH-45;
+			LAPS4_Y = (BASEVIDHEIGHT)-13;
+
+			POSI4_X = BASEVIDWIDTH-9;
+			POSI4_Y = (BASEVIDHEIGHT)- 16;
+
+
 
 			STCD_X = BASEVIDWIDTH/4;
 
@@ -6331,7 +6371,8 @@ static void K_drawKartItem(void)
 	patch_t *localpatch = kp_nodraw;
 	patch_t *localbg = ((offset) ? kp_itembg[2] : kp_itembg[0]);
 	patch_t *localinv = ((offset) ? kp_invincibility[((leveltime % (6*3)) / 3) + 7] : kp_invincibility[(leveltime % (7*3)) / 3]);
-	INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT);
+	INT32 fx = 0, fy = 0, fflags = 0;	// final coords for hud and flags...
+	//INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT);
 	const INT32 numberdisplaymin = ((!offset && stplyr->kartstuff[k_itemtype] == KITEM_ORBINAUT) ? 5 : 2);
 	INT32 itembar = 0;
 	UINT8 localcolor = SKINCOLOR_NONE;
@@ -6548,26 +6589,61 @@ static void K_drawKartItem(void)
 		}
 	}
 
+	// pain and suffering defined below
+	if (splitscreen < 2)	// don't change shit for THIS splitscreen.
+	{
+		fx = ITEM_X;
+		fy = ITEM_Y;
+		fflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT);
+	}
+	else				// now we're having a fun game.
+	{
+		if (stplyr == &players[displayplayer])
+		{
+			fx = ITEM_X;
+			fy = ITEM_Y;
+			fflags = V_SNAPTOTOP|V_SNAPTOLEFT;
+		}
+		else if (stplyr == &players[secondarydisplayplayer])
+		{
+			fx = ITEM2_X;
+			fy = ITEM2_Y;
+			fflags = V_SNAPTOTOP|V_SNAPTORIGHT;
+		}
+		else if (stplyr == &players[thirddisplayplayer])
+		{
+			fx = ITEM3_X;
+			fy = ITEM3_Y;
+			fflags = V_SNAPTOLEFT;
+		}
+		else if (stplyr == &players[fourthdisplayplayer])
+		{
+			fx = ITEM4_X;
+			fy = ITEM4_Y;
+			fflags = V_SNAPTORIGHT;
+		}
+	}
+
 	if (localcolor != SKINCOLOR_NONE)
 		colmap = R_GetTranslationColormap(colormode, localcolor, 0);
 
-	V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, localbg);
+	V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, localbg);
 
 	// Then, the numbers:
 	if (stplyr->kartstuff[k_itemamount] >= numberdisplaymin && !stplyr->kartstuff[k_itemroulette])
 	{
-		V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, kp_itemmulsticker[offset]);
-		V_DrawFixedPatch(ITEM_X<<FRACBITS, ITEM_Y<<FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, localpatch, colmap);
+		V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, kp_itemmulsticker[offset]);
+		V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, FRACUNIT, V_HUDTRANS|fflags, localpatch, colmap);
 		if (offset)
-			V_DrawString(ITEM_X+24, ITEM_Y+31, V_ALLOWLOWERCASE|V_HUDTRANS|splitflags, va("x%d", stplyr->kartstuff[k_itemamount]));
+			V_DrawString(fx+24, fy+31, V_ALLOWLOWERCASE|V_HUDTRANS|fflags, va("x%d", stplyr->kartstuff[k_itemamount]));
 		else
 		{
-			V_DrawScaledPatch(ITEM_X+28, ITEM_Y+41, V_HUDTRANS|splitflags, kp_itemx);
-			V_DrawKartString(ITEM_X+38, ITEM_Y+36, V_HUDTRANS|splitflags, va("%d", stplyr->kartstuff[k_itemamount]));
+			V_DrawScaledPatch(fy+28, fy+41, V_HUDTRANS|fflags, kp_itemx);
+			V_DrawKartString(fx+38, fy+36, V_HUDTRANS|fflags, va("%d", stplyr->kartstuff[k_itemamount]));
 		}
 	}
 	else
-		V_DrawFixedPatch(ITEM_X<<FRACBITS, ITEM_Y<<FRACBITS, FRACUNIT, V_HUDTRANS|splitflags, localpatch, colmap);
+		V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, FRACUNIT, V_HUDTRANS|fflags, localpatch, colmap);
 
 	// Extensible meter, currently only used for rocket sneaker...
 	if (itembar && hudtrans)
@@ -6579,22 +6655,23 @@ static void K_drawKartItem(void)
 		const INT32 height = (offset ? 1 : 2);
 		const INT32 x = (offset ? 17 : 11), y = (offset ? 27 : 35);
 
-		V_DrawScaledPatch(ITEM_X+x, ITEM_Y+y, V_HUDTRANS|splitflags, kp_itemtimer[offset]);
+		V_DrawScaledPatch(fx+x, fy+y, V_HUDTRANS|fflags, kp_itemtimer[offset]);
 		// The left dark "AA" edge
-		V_DrawFill(ITEM_X+x+1, ITEM_Y+y+1, (length == 2 ? 2 : 1), height, 12|splitflags);
+		V_DrawFill(fx+x+1, fy+y+1, (length == 2 ? 2 : 1), height, 12|fflags);
 		// The bar itself
 		if (length > 2)
 		{
-			V_DrawFill(ITEM_X+x+length, ITEM_Y+y+1, 1, height, 12|splitflags); // the right one
+			V_DrawFill(fx+x+length, fy+y+1, 1, height, 12|fflags); // the right one
 			if (height == 2)
-				V_DrawFill(ITEM_X+x+2, ITEM_Y+y+2, length-2, 1, 8|splitflags); // the dulled underside
-			V_DrawFill(ITEM_X+x+2, ITEM_Y+y+1, length-2, 1, 120|splitflags); // the shine
+				V_DrawFill(fx+x+2, fy+y+2, length-2, 1, 8|fflags); // the dulled underside
+			V_DrawFill(fx+x+2, fy+y+1, length-2, 1, 120|fflags); // the shine
 		}
 	}
 
 	// Quick Eggman numbers
 	if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/)
-		V_DrawScaledPatch(ITEM_X+17, ITEM_Y+13-offset, V_HUDTRANS|splitflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]);
+		V_DrawScaledPatch(fx+17, fy+13-offset, V_HUDTRANS|fflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]);
+
 }
 
 void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UINT8 mode)
@@ -6754,11 +6831,12 @@ static void K_DrawKartPositionNum(INT32 num)
 	// POSI_Y = BASEVIDHEIGHT- 64;	// 136
 
 	boolean win = (stplyr->exiting && num == 1);
-	INT32 X = POSI_X;
+	//INT32 X = POSI_X;
 	INT32 W = SHORT(kp_positionnum[0][0]->width);
 	fixed_t scale = FRACUNIT;
 	patch_t *localpatch = kp_positionnum[0][0];
-	INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT);
+	//INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT);
+	INT32 fx = 0, fy = 0, fflags = 0;
 
 	if (stplyr->kartstuff[k_positiondelay] || stplyr->exiting)
 		scale *= 2;
@@ -6767,10 +6845,53 @@ static void K_DrawKartPositionNum(INT32 num)
 
 	W = FixedMul(W<<FRACBITS, scale)>>FRACBITS;
 
+	// pain and suffering defined below
+	if (splitscreen < 2)	// for this splitscreen, we'll be using more unique coordinates so we don't overlap the minimap :D
+	{
+		fx = POSI_X;
+		if (stplyr == &players[displayplayer])	// for player 1: display this at the top right, above the minimap.
+		{
+			fy = 32;
+			fflags = V_SNAPTOTOP|V_SNAPTOLEFT;
+		}
+		else	// if we're not p1, that means we're p2. display this at the bottom right, below the minimap.
+		{
+			fy = BASEVIDHEIGHT - 8;
+			fflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT;
+		}
+	}
+	else				// now we're having a fun game.
+	{
+		if (stplyr == &players[displayplayer])
+		{
+			fx = POSI_X;
+			fy = POSI_Y;
+			fflags = V_SNAPTOLEFT;
+		}
+		else if (stplyr == &players[secondarydisplayplayer])
+		{
+			fx = POSI2_X;
+			fy = POSI2_Y;
+			fflags = V_SNAPTORIGHT;
+		}
+		else if (stplyr == &players[thirddisplayplayer])
+		{
+			fx = POSI3_X;
+			fy = POSI3_Y;
+			fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM;
+		}
+		else if (stplyr == &players[fourthdisplayplayer])
+		{
+			fx = POSI4_X;
+			fy = POSI4_Y;
+			fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM;
+		}
+	}
+
 	// Special case for 0
 	if (!num)
 	{
-		V_DrawFixedPatch(X<<FRACBITS, POSI_Y<<FRACBITS, scale, V_HUDTRANSHALF|splitflags, kp_positionnum[0][0], NULL);
+		V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, scale, V_HUDTRANSHALF|fflags, kp_positionnum[0][0], NULL);
 		return;
 	}
 
@@ -6812,9 +6933,9 @@ static void K_DrawKartPositionNum(INT32 num)
 		else
 			localpatch = kp_positionnum[num % 10][0];
 
-		V_DrawFixedPatch(X<<FRACBITS, POSI_Y<<FRACBITS, scale, V_HUDTRANSHALF|splitflags, localpatch, NULL);
+		V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, scale, V_HUDTRANSHALF|fflags, localpatch, NULL);
 
-		X -= W;
+		fx -= W;
 		num /= 10;
 	}
 }
@@ -7055,15 +7176,52 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I
 static void K_drawKartLaps(void)
 {
 	INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT);
+	INT32 fx = 0, fy = 0, fflags = 0;	// stuff for 3p / 4p splitscreen.
 
 	if (splitscreen > 1)
 	{
-		V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_splitlapflag);
+
+		// pain and suffering defined below
+		if (splitscreen < 2)	// don't change shit for THIS splitscreen.
+		{
+			fx = LAPS_X;
+			fy = LAPS_Y;
+			fflags = splitflags;
+		}
+		else				// now we're having a fun game.
+		{
+			if (stplyr == &players[displayplayer])
+			{
+				fx = LAPS_X;
+				fy = LAPS_Y;
+				fflags = V_SNAPTOLEFT;
+			}
+			else if (stplyr == &players[secondarydisplayplayer])
+			{
+				fx = LAPS2_X;
+				fy = LAPS2_Y;
+				fflags = V_SNAPTORIGHT;
+			}
+			else if (stplyr == &players[thirddisplayplayer])
+			{
+				fx = LAPS3_X;
+				fy = LAPS3_Y;
+				fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM;
+			}
+			else if (stplyr == &players[fourthdisplayplayer])
+			{
+				fx = LAPS4_X;
+				fy = LAPS4_Y;
+				fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM;
+			}
+		}
+
+		V_DrawScaledPatch(fx, fy, V_HUDTRANS|fflags, kp_splitlapflag);
 
 		if (stplyr->exiting)
-			V_DrawString(LAPS_X+13, LAPS_Y+1, V_HUDTRANS|splitflags, "FIN");
+			V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, "FIN");
 		else
-			V_DrawString(LAPS_X+13, LAPS_Y+1, V_HUDTRANS|splitflags, va("%d/%d", stplyr->laps+1, cv_numlaps.value));
+			V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->laps+1, cv_numlaps.value));
 	}
 	else
 	{
@@ -7102,18 +7260,46 @@ static void K_drawKartBumpersOrKarma(void)
 {
 	UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0);
 	INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTOLEFT);
+	INT32 fx = 0, fy = 0, fflags = 0;
 
 	if (splitscreen > 1)
 	{
+
+		// we will reuse lap coords here since it's essentially the same shit.
+		if (stplyr == &players[displayplayer])
+		{
+			fx = LAPS_X;
+			fy = LAPS_Y;
+			fflags = V_SNAPTOLEFT;
+		}
+		else if (stplyr == &players[secondarydisplayplayer])
+		{
+			fx = LAPS2_X;
+			fy = LAPS2_Y;
+			fflags = V_SNAPTORIGHT;
+		}
+		else if (stplyr == &players[thirddisplayplayer])
+		{
+			fx = LAPS3_X;
+			fy = LAPS3_Y;
+			fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM;
+		}
+		else if (stplyr == &players[fourthdisplayplayer])
+		{
+			fx = LAPS4_X;
+			fy = LAPS4_Y;
+			fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM;
+		}
+
 		if (stplyr->kartstuff[k_bumper] <= 0)
 		{
-			V_DrawMappedPatch(LAPS_X, LAPS_Y-1, V_HUDTRANS|splitflags, kp_splitkarmabomb, colormap);
-			V_DrawString(LAPS_X+13, LAPS_Y+1, V_HUDTRANS|splitflags, va("%d/2", stplyr->kartstuff[k_comebackpoints]));
+			V_DrawMappedPatch(fx, fy-1, V_HUDTRANS|fflags, kp_splitkarmabomb, colormap);
+			V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/2", stplyr->kartstuff[k_comebackpoints]));
 		}
 		else
 		{
-			V_DrawMappedPatch(LAPS_X, LAPS_Y-1, V_HUDTRANS|splitflags, kp_rankbumper, colormap);
-			V_DrawString(LAPS_X+13, LAPS_Y+1, V_HUDTRANS|splitflags, va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value));
+			V_DrawMappedPatch(fx, fy-1, V_HUDTRANS|fflags, kp_rankbumper, colormap);
+			V_DrawString(fx+13, fy+1, V_HUDTRANS|fflags, va("%d/%d", stplyr->kartstuff[k_bumper], cv_kartbumpers.value));
 		}
 	}
 	else
@@ -7166,11 +7352,53 @@ static void K_drawKartWanted(void)
 {
 	UINT8 i, numwanted = 0;
 	UINT8 *colormap = NULL;
+	INT32 fx = 0, fy = 0, fflags = 0;	// splitscreen stuff
 
 	if (splitscreen) // Can't fit the poster on screen, sadly
 	{
+
+		// wanted is a bit of a mess but don't worry.
+		if (splitscreen < 2)	// don't change shit for THIS splitscreen.
+		{
+			fx = WANT_X;
+			fy = WANT_Y;
+			fflags =  K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT);
+		}
+		else				// now we're having a fun game.
+		{
+			if (stplyr == &players[displayplayer])
+			{
+				fx = LAPS_X;
+				fy = POSI_Y - 8;
+				fflags = V_SNAPTOLEFT;
+			}
+			else if (stplyr == &players[secondarydisplayplayer])
+			{
+				fx = LAPS2_X - 10;
+				fy = POSI2_Y - 8;
+				fflags = V_SNAPTORIGHT;
+			}
+			else if (stplyr == &players[thirddisplayplayer])
+			{
+				fx = LAPS3_X;
+				fy = POSI3_Y - 8;
+				fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM;
+			}
+			else if (stplyr == &players[fourthdisplayplayer])
+			{
+				fx = LAPS4_X - 10;
+				fy = POSI4_Y - 8;
+				fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM;
+			}
+		}
+
 		if (K_IsPlayerWanted(stplyr) && leveltime % 10 > 3)
-			V_DrawRightAlignedString(WANT_X, WANT_Y, K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_HUDTRANS|V_ORANGEMAP), "WANTED");
+		{
+			if (splitscreen > 1)
+				V_DrawString(fx, fy-4, fflags|V_HUDTRANS|V_ORANGEMAP, "WANTED");
+			else
+				V_DrawRightAlignedString(fx, fy, fflags|V_HUDTRANS|V_ORANGEMAP, "WANTED");
+		}
 		return;
 	}
 
@@ -7360,7 +7588,7 @@ static void K_drawKartMinimap(void)
 	patch_t *AutomapPic;
 	INT32 i = 0;
 	INT32 x, y;
-	INT32 minimaptrans, splitflags = (splitscreen ? 0 : V_SNAPTORIGHT);
+	INT32 minimaptrans, splitflags = (splitscreen < 2 ? 0 : V_SNAPTORIGHT);
 	boolean dop1later = false;
 
 	// Draw the HUD only when playing in a level.
@@ -7383,7 +7611,7 @@ static void K_drawKartMinimap(void)
 
 	if (timeinmap > 105)
 	{
-		minimaptrans = (splitscreen ? 10 : cv_kartminimap.value);
+		minimaptrans = (splitscreen == 2 ? 10 : cv_kartminimap.value);
 		if (timeinmap <= 113)
 			minimaptrans = ((((INT32)timeinmap) - 105)*minimaptrans)/(113-105);
 		if (!minimaptrans)
@@ -7400,7 +7628,7 @@ static void K_drawKartMinimap(void)
 	else
 		V_DrawScaledPatch(x, y, splitflags, AutomapPic);
 
-	if (!splitscreen)
+	if (!(splitscreen == 2))
 	{
 		splitflags &= ~minimaptrans;
 		splitflags |= V_HUDTRANSHALF;
@@ -8092,13 +8320,13 @@ void K_drawKartHUD(void)
 		|| ((splitscreen > 2 && stplyr == &players[fourthdisplayplayer]) && !camera4.chase))
 		K_drawKartFirstPerson();
 
-	if (splitscreen == 2) // Player 4 in 3P is the minimap :p
+/*	if (splitscreen == 2) // Player 4 in 3P is the minimap :p
 	{
 #ifdef HAVE_BLUA
 		if (LUA_HudEnabled(hud_minimap))
 #endif
 		K_drawKartMinimap();
-	}
+	}*/
 
 	// Draw full screen stuff that turns off the rest of the HUD
 	if (mapreset && stplyr == &players[displayplayer])
@@ -8122,7 +8350,7 @@ void K_drawKartHUD(void)
 	if (cv_kartcheck.value && !splitscreen && !players[displayplayer].exiting)
 		K_drawKartPlayerCheck();
 
-	if (splitscreen == 0 && cv_kartminimap.value && !titledemo)
+	if (cv_kartminimap.value && !titledemo)
 	{
 #ifdef HAVE_BLUA
 		if (LUA_HudEnabled(hud_minimap))