diff --git a/src/k_hud.cpp b/src/k_hud.cpp
index 2fbfcd0c3afc281ef6c754345d6f05738f373787..6f74c996bc74173c5d2247bbd548935de28427d3 100644
--- a/src/k_hud.cpp
+++ b/src/k_hud.cpp
@@ -1395,6 +1395,9 @@ static void K_drawKartItem(void)
 	vector2_t rouletteCrop = {7, 7};
 	INT32 i;
 
+	boolean flashOnOne = false;
+	boolean flashOnTwo = false;
+
 	if (stplyr->itemRoulette.itemListLen > 0)
 	{
 		// Init with item roulette stuff.
@@ -1446,10 +1449,8 @@ static void K_drawKartItem(void)
 
 		if (stplyr->stealingtimer < 0)
 		{
-			if (leveltime & 2)
-				localpatch[1] = kp_hyudoro[offset];
-			else
-				localpatch[1] = kp_nodraw;
+			localpatch[1] = kp_hyudoro[offset];
+			flashOnTwo = true;
 		}
 		else if ((stplyr->stealingtimer > 0) && (leveltime & 2))
 		{
@@ -1457,10 +1458,8 @@ static void K_drawKartItem(void)
 		}
 		else if (stplyr->eggmanexplode > 1)
 		{
-			if (leveltime & 1)
-				localpatch[1] = kp_eggman[offset];
-			else
-				localpatch[1] = kp_nodraw;
+			localpatch[1] = kp_eggman[offset];
+			flashOnOne = true;
 		}
 		else if (stplyr->ballhogcharge > 0)
 		{
@@ -1470,27 +1469,21 @@ static void K_drawKartItem(void)
 			itembar = stplyr->ballhogcharge % BALLHOGINCREMENT;
 			maxl = BALLHOGINCREMENT;
 
-			if (leveltime & 1)
-				localpatch[1] = kp_ballhog[offset];
-			else
-				localpatch[1] = kp_nodraw;
+			localpatch[1] = kp_ballhog[offset];
+			flashOnOne = true;
 		}
 		else if (stplyr->rocketsneakertimer > 1)
 		{
 			itembar = stplyr->rocketsneakertimer;
 			maxl = (itemtime*3) - barlength;
 
-			if (leveltime & 1)
-				localpatch[1] = kp_rocketsneaker[offset];
-			else
-				localpatch[1] = kp_nodraw;
+			localpatch[1] = kp_rocketsneaker[offset];
+			flashOnOne = true;
 		}
 		else if (stplyr->sadtimer > 0)
 		{
-			if (leveltime & 2)
-				localpatch[1] = kp_sadface[offset];
-			else
-				localpatch[1] = kp_nodraw;
+			localpatch[1] = kp_sadface[offset];
+			flashOnTwo = true;
 		}
 		else if (stplyr->itemRoulette.reserved > 0)
 		{
@@ -1527,11 +1520,19 @@ static void K_drawKartItem(void)
 					break;
 			}
 
-			if ((stplyr->itemflags & IF_ITEMOUT) && !(leveltime & 1))
+			if ((stplyr->itemflags & IF_ITEMOUT))
+				flashOnOne = true;
+		}
+
+		if (!cv_reducevfx.value)
+		{
+			if (flashOnOne && !(leveltime & 1))
+				localpatch[1] = kp_nodraw;
+			else if (flashOnTwo && !(leveltime & 2))
 				localpatch[1] = kp_nodraw;
 		}
 
-		if (stplyr->karthud[khud_itemblink] && (leveltime & 1))
+		if (stplyr->karthud[khud_itemblink] && (leveltime & 1) && !(cv_reducevfx.value))
 		{
 			colormode[1] = TC_BLINK;
 
@@ -1639,6 +1640,13 @@ static void K_drawKartItem(void)
 		// A little goofy, but helps with ballhog charge conveyance—you're "loading" them.
 		UINT8 fakeitemamount = stplyr->itemamount - (stplyr->ballhogcharge / BALLHOGINCREMENT);
 
+		boolean transflag = V_HUDTRANS;
+
+		if (cv_reducevfx.value && (flashOnOne || flashOnTwo))
+		{
+			transflag = V_HUDTRANSHALF;
+		}
+
 		if (fakeitemamount >= numberdisplaymin && stplyr->itemRoulette.active == false)
 		{
 			// Then, the numbers:
@@ -1650,7 +1658,7 @@ static void K_drawKartItem(void)
 
 			V_DrawFixedPatch(
 				fx<<FRACBITS, (fy<<FRACBITS) + rouletteOffset,
-				FRACUNIT, V_HUDTRANS|V_SLIDEIN|fflags,
+				FRACUNIT, transflag|V_SLIDEIN|fflags,
 				localpatch[1], (localcolor[1] ? R_GetTranslationColormap(colormode[1], localcolor[1], GTC_CACHE) : NULL)
 			);
 
@@ -1671,7 +1679,7 @@ static void K_drawKartItem(void)
 		{
 			V_DrawFixedPatch(
 				fx<<FRACBITS, (fy<<FRACBITS) + rouletteOffset,
-				FRACUNIT, V_HUDTRANS|V_SLIDEIN|fflags,
+				FRACUNIT, transflag|V_SLIDEIN|fflags,
 				localpatch[1], (localcolor[1] ? R_GetTranslationColormap(colormode[1], localcolor[1], GTC_CACHE) : NULL)
 			);
 		}
@@ -1808,7 +1816,7 @@ static void K_drawKartSlotMachine(void)
 		}
 	}
 
-	if (stplyr->karthud[khud_itemblink] && (leveltime & 1))
+	if (stplyr->karthud[khud_itemblink] && (leveltime & 1) && !cv_reducevfx.value)
 	{
 		colormode[1] = TC_BLINK;
 		localcolor[1] = SKINCOLOR_WHITE;