diff --git a/src/r_draw.c b/src/r_draw.c
index cd219c15f624cf9726148ac6d42124f2f40eef99..a8f48bbebb01282e39ec80f6aa31df8278b0afd9 100644
--- a/src/r_draw.c
+++ b/src/r_draw.c
@@ -236,27 +236,27 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
 		0x03, // SKINCOLOR_SILVER
 		0x08, // SKINCOLOR_GREY
 		0x18, // SKINCOLOR_BLACK
-		0xd0, // SKINCOLOR_CYAN
-		0xdc, // SKINCOLOR_TEAL
-		0xc8, // SKINCOLOR_STEELBLUE
-		0xe2, // SKINCOLOR_BLUE
-		0x40, // SKINCOLOR_PEACH
-		0x48, // SKINCOLOR_TAN
-		0x90, // SKINCOLOR_PINK
-		0xf8, // SKINCOLOR_LAVENDER
-		0xc0, // SKINCOLOR_PURPLE
-		0x52, // SKINCOLOR_ORANGE
-		0x5c, // SKINCOLOR_ROSEWOOD
-		0x20, // SKINCOLOR_BEIGE
-		0x30, // SKINCOLOR_BROWN
-		0x7d, // SKINCOLOR_RED
-		0x85, // SKINCOLOR_DARKRED
-		0xb8, // SKINCOLOR_NEONGREEN
-		0xa0, // SKINCOLOR_GREEN
-		0xb0, // SKINCOLOR_ZIM
-		0x69, // SKINCOLOR_OLIVE
-		0x67, // SKINCOLOR_YELLOW
-		0x70, // SKINCOLOR_GOLD
+		0x70, // SKINCOLOR_CYAN
+		0x7c, // SKINCOLOR_TEAL
+		0x9a, // SKINCOLOR_STEELBLUE
+		0x80, // SKINCOLOR_BLUE
+		0xc8, // SKINCOLOR_PEACH
+		0x54, // SKINCOLOR_TAN
+		0xc0, // SKINCOLOR_PINK
+		0xb0, // SKINCOLOR_LAVENDER
+		0xa0, // SKINCOLOR_PURPLE
+		0x30, // SKINCOLOR_ORANGE
+		0x30, // SKINCOLOR_ROSEWOOD
+		0xe0, // SKINCOLOR_BEIGE
+		0xd0, // SKINCOLOR_BROWN
+		0x20, // SKINCOLOR_RED
+		0x28, // SKINCOLOR_DARKRED
+		0xf0, // SKINCOLOR_NEONGREEN
+		0x60, // SKINCOLOR_GREEN
+		0x58, // SKINCOLOR_ZIM
+		0x49, // SKINCOLOR_OLIVE
+		0x48, // SKINCOLOR_YELLOW
+		0x40, // SKINCOLOR_GOLD
 	};
 	INT32 i;
 	INT32 starttranscolor;
@@ -293,23 +293,16 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
 	{
 	case SKINCOLOR_SILVER:
 	case SKINCOLOR_GREY:
-	case SKINCOLOR_PEACH:
-	case SKINCOLOR_BEIGE:
 	case SKINCOLOR_BROWN:
 	case SKINCOLOR_RED:
 	case SKINCOLOR_GREEN:
 	case SKINCOLOR_BLUE:
-		// 16 color ramp
-		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
-			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + i);
-		break;
 
 	case SKINCOLOR_ORANGE:
-		// 14 colors of orange + brown
-		for (i = 0; i < SKIN_RAMP_LENGTH-2; i++)
+	case SKINCOLOR_ROSEWOOD:
+		// 16 color ramp
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
 			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + i);
-		for (i = 0; i < 2; i++)
-			dest_colormap[starttranscolor + (i+SKIN_RAMP_LENGTH-2)] = (UINT8)(152 + i);
 		break;
 
 	case SKINCOLOR_CYAN:
@@ -320,57 +313,141 @@ static void R_GenerateTranslationColormap(UINT8 *dest_colormap, INT32 skinnum, U
 
 	case SKINCOLOR_WHITE:
 	case SKINCOLOR_BLACK:
-	case SKINCOLOR_STEELBLUE:
 	case SKINCOLOR_PINK:
-	case SKINCOLOR_LAVENDER:
-	case SKINCOLOR_PURPLE:
 	case SKINCOLOR_DARKRED:
 	case SKINCOLOR_ZIM:
-	case SKINCOLOR_YELLOW:
-	case SKINCOLOR_GOLD:
 		// 8 color ramp
 		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
 			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (i >> 1));
 		break;
 
 	case SKINCOLOR_TEAL:
-		// 5 color ramp
+		// 5 color ramp, from 2 colour ranges
 		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
 		{
 			if (5*i/16 == 0)
-				dest_colormap[starttranscolor + i] = 0xf7;
+				dest_colormap[starttranscolor + i] = 0xf8;
 			else
 				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (5*i/SKIN_RAMP_LENGTH) - 1);
 		}
 		break;
 
-	case SKINCOLOR_OLIVE:
-		// 7 color ramp
+	case SKINCOLOR_PEACH:
+		// 10 color rame, from 2 color ranges
 		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
-			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (7*i/SKIN_RAMP_LENGTH));
+		{
+			if (10*i/16 == 0)
+				dest_colormap[starttranscolor + i] = 0xC0; // Lightest
+			else if (10*i/16 == 1)
+				dest_colormap[starttranscolor + i] = 0x30; // Second
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (10*i/SKIN_RAMP_LENGTH) - 2); // main
+		}
 		break;
 
 	case SKINCOLOR_TAN:
-		// 16 color ramp, from two color ranges
-		for (i = 0; i < SKIN_RAMP_LENGTH/2; i++) // Peach half
-			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + i);
-		for (i = 0; i < SKIN_RAMP_LENGTH/2; i++) // Brown half
-			dest_colormap[starttranscolor + (i+8)] = (UINT8)(48 + i);
+		// 8 color rame, from 3 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (8*i/16 == 0)
+				dest_colormap[starttranscolor + i] = 0x51; // Lightest 1
+			else if (8*i/16 == 5)
+				dest_colormap[starttranscolor + i] = 0xE5; // Darkest 1
+			else if (8*i/16 == 6)
+				dest_colormap[starttranscolor + i] = 0xE9; // Darkest 2
+			else if (8*i/16 == 7)
+				dest_colormap[starttranscolor + i] = 0xDD; // Darkest 3
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (8*i/SKIN_RAMP_LENGTH) - 1); // main
+		}
 		break;
 
-	case SKINCOLOR_ROSEWOOD:
-		// 12 color ramp, from two color ranges!
-		for (i = 0; i < 6; i++) // Orange ...third?
-			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (12*i/SKIN_RAMP_LENGTH));
-		for (i = 0; i < 10; i++) // Rosewood two-thirds-ish
-			dest_colormap[starttranscolor + (i+6)] = (UINT8)(152 + (12*i/SKIN_RAMP_LENGTH));
+	case SKINCOLOR_BEIGE:
+		// 13 color range, from 2 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (13*i/16 == 12)
+				dest_colormap[starttranscolor + i] = 0xDD; // darkest
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (13*i/SKIN_RAMP_LENGTH)); // Neon green
+		}
+		break;
+
+	case SKINCOLOR_STEELBLUE:
+		// 8 color range, from 2 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (8*i/16 <= 1)
+				dest_colormap[starttranscolor + i] = 0x80 + 8*i/16; // Lightest
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (8*i/SKIN_RAMP_LENGTH) - 2); // main
+		}
+		break;
+
+	case SKINCOLOR_LAVENDER:
+		// 10 color range, from 2 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (10*i/16 <= 1)
+				dest_colormap[starttranscolor + i] = 0xEC + 10*i/16; // Lightest
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (10*i/SKIN_RAMP_LENGTH) - 2); // main
+		}
+		break;
+
+	case SKINCOLOR_PURPLE:
+		// 12 color range, from 2 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (12*i/16 == 0)
+				dest_colormap[starttranscolor + i] = 0xEC; // Lightest
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (12*i/SKIN_RAMP_LENGTH) - 1); // main
+		}
+		break;
+
+	case SKINCOLOR_YELLOW:
+		// 13 color range, from 2 color ranges
+		// actually magenta
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (12*i/16 <= 3)
+				dest_colormap[starttranscolor + i] = 0x50 + 12*i/16; // Lightest
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (12*i/SKIN_RAMP_LENGTH) - 4); // main
+		}
+		break;
+
+	case SKINCOLOR_GOLD:
+		// 10 color rame, from 2 color ranges
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (10*i/16 == 0)
+				dest_colormap[starttranscolor + i] = 0x50; // Lightest
+			else if (10*i/16 == 1)
+				dest_colormap[starttranscolor + i] = 0x53; // Second
+			else
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (10*i/SKIN_RAMP_LENGTH) - 2); // main
+		}
+		break;
+
+	case SKINCOLOR_OLIVE:
+		// 7 color ramp
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+			dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (7*i/SKIN_RAMP_LENGTH));
 		break;
 
 	case SKINCOLOR_NEONGREEN:
 		// Multi-color ramp
-		dest_colormap[starttranscolor] = 0xA0; // Brighter green
-		for (i = 0; i < SKIN_RAMP_LENGTH-1; i++) // Neon Green
-			dest_colormap[starttranscolor + (i+1)] = (UINT8)(skinbasecolors[color - 1] + (6*i/(SKIN_RAMP_LENGTH-1)));
+		for (i = 0; i < SKIN_RAMP_LENGTH; i++)
+		{
+			if (10*i/16 <= 1)
+				dest_colormap[starttranscolor + i] = 0x60 + 10*i/16; // Brighter green
+			else if (10*i/16 < 9)
+				dest_colormap[starttranscolor + i] = (UINT8)(skinbasecolors[color - 1] + (10*i/SKIN_RAMP_LENGTH) - 2); // Neon green
+			else
+				dest_colormap[starttranscolor + i] = 0x6F;
+		}
 		break;
 
 	// Super colors, from lightest to darkest!