r5352 - in trunk/data: . qcsrc/client qcsrc/common qcsrc/menu/item

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Mon Dec 29 14:02:24 EST 2008


Author: div0
Date: 2008-12-29 14:02:22 -0500 (Mon, 29 Dec 2008)
New Revision: 5352

Modified:
   trunk/data/defaultNexuiz.cfg
   trunk/data/qcsrc/client/Main.qc
   trunk/data/qcsrc/client/View.qc
   trunk/data/qcsrc/client/ctf.qc
   trunk/data/qcsrc/client/miscfunctions.qc
   trunk/data/qcsrc/client/sbar.qc
   trunk/data/qcsrc/client/teamplay.qc
   trunk/data/qcsrc/common/util.qc
   trunk/data/qcsrc/common/util.qh
   trunk/data/qcsrc/menu/item/inputbox.c
Log:
Translate color codes for old clients


Modified: trunk/data/defaultNexuiz.cfg
===================================================================
--- trunk/data/defaultNexuiz.cfg	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/defaultNexuiz.cfg	2008-12-29 19:02:22 UTC (rev 5352)
@@ -1282,3 +1282,5 @@
 set g_ballistics_force_uzi_bulletconstant 115 // 5.8qu
 set g_ballistics_force_shotgun_speed 15000 // speed of shotgun bullets if g_ballistics_force is 1
 set g_ballistics_force_shotgun_bulletconstant 50 // 3.9qu
+
+set cl_stripcolorcodes 0 // experimental feature (notes: strips ALL color codes from messages!)

Modified: trunk/data/qcsrc/client/Main.qc
===================================================================
--- trunk/data/qcsrc/client/Main.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/Main.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -200,7 +200,7 @@
 	for(i = 0; i < maxclients; ++i)
 	{
 		e = playerslots[i];
-		if(getplayerkey(i, "name") == "")
+		if(GetPlayerName(i) == "")
 		{
 			if(e.sort_prev)
 			{
@@ -588,12 +588,12 @@
 // CSQC_Parse_Print : Provides the print string in the first parameter that the server provided.  To execute standard behavior, simply execute print with the string.
 void CSQC_Parse_Print(string strMessage)
 {
-	print(strMessage);
+	print(ColorTranslateRGB(strMessage));
 }
 // CSQC_Parse_CenterPrint : Provides the centerprint string in the first parameter that the server provided.  To execute standard behavior, simply execute cprint with the string.
 void CSQC_Parse_CenterPrint(string strMessage)
 {
-	cprint(strMessage);
+	cprint(ColorTranslateRGB(strMessage));
 }
 
 void CSQC_CheckRevision();
@@ -690,7 +690,7 @@
 			race_previousbesttime = ReadShort();
 			if(race_previousbestname)
 				strunzone(race_previousbestname);
-			race_previousbestname = strzone(ReadString());
+			race_previousbestname = strzone(ColorTranslateRGB(ReadString()));
 
 			race_checkpointtime = time;
 
@@ -714,7 +714,7 @@
 			race_nextbesttime = ReadShort();
 			if(race_nextbestname)
 				strunzone(race_nextbestname);
-			race_nextbestname = strzone(ReadString());
+			race_nextbestname = strzone(ColorTranslateRGB(ReadString()));
 			break;
 
 		case RACE_NET_CHECKPOINT_HIT_RACE:

Modified: trunk/data/qcsrc/client/View.qc
===================================================================
--- trunk/data/qcsrc/client/View.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/View.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -264,6 +264,7 @@
 	
 	sbar_alpha_fg = cvar("sbar_alpha_fg" );
 	sbar_hudselector = cvar("sbar_hudselector");
+	ColorTranslateMode = cvar("cl_stripcolorcodes");
 	activeweapon = getstati(STAT_SWITCHWEAPON);
 	f = cvar("teamplay");
 	if(f != teamplay)

Modified: trunk/data/qcsrc/client/ctf.qc
===================================================================
--- trunk/data/qcsrc/client/ctf.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/ctf.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -48,7 +48,7 @@
 				++n;
 				if(n == 10)
 					n = 0;
-				drawcolorcodedstring(ps, strcat(ftos(n), ") ", getplayerkey(i, "name"), " : ", ftos(getstatf(STAT_CTF_STATE))), '8 8 0', 1, 0); ps += po;
+				drawcolorcodedstring(ps, strcat(ftos(n), ") ", GetPlayerName(i), " : ", ftos(getstatf(STAT_CTF_STATE))), '8 8 0', 1, 0); ps += po;
 			}
 		}
 		drawstring(ps, "ESC) Exit Menu", '8 8 0', '1 1 0', 1, 0); ps += po;

Modified: trunk/data/qcsrc/client/miscfunctions.qc
===================================================================
--- trunk/data/qcsrc/client/miscfunctions.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/miscfunctions.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -260,3 +260,125 @@
 	w_y = -1 * v_x * sin(a) + v_y * cos(a);
 	return w;
 }
+
+float ColorTranslateMode;
+
+string ColorTranslateRGB(string s)
+{
+	if not(ColorTranslateMode & 2)
+	if(csqc_flags & CSQC_FLAG_READPICTURE)
+	{
+		if(ColorTranslateMode & 1)
+			return strdecolorize(s);
+		else
+			return s;
+	}
+	
+	// running on an OLD engine!
+	// must translate ^xRGB codes to regular color codes
+	float i, n;
+	string s2, ch, ch2;
+	vector theTempColor, hsv;
+	float component;
+
+	s2 = "";
+
+	n = strlen(s);
+	for(i = 0; i < n; ++i)
+	{
+		ch = substring(s, i, 1);
+		if(ch == "^")
+		{
+			ch2 = substring(s, i+1, 1);
+			if(ch2 == "^")
+			{
+				s2 = strcat(s2, ch, ch2);
+			}
+			else if(ch2 == "0" || stof(ch2)) // digit?
+			{
+				if not(ColorTranslateMode & 1)
+					s2 = strcat(s2, ch, ch2);
+			}
+			else if(ch2 == "x") // ^x found
+			{
+				theTempColor = '0 0 0';
+				
+				component = HEXDIGIT_TO_DEC(substring(s, i+2, 1));
+				if (component >= 0) // ^xr found
+				{
+					theTempColor_x = component/15;
+					
+					component = HEXDIGIT_TO_DEC(substring(s, i+3, 1));
+					if (component >= 0) // ^xrg found
+					{
+						theTempColor_y = component/15;
+						
+						component = HEXDIGIT_TO_DEC(substring(s, i+4, 1));
+						if (component >= 0) // ^xrgb found
+						{
+							theTempColor_z = component/15;
+
+							if not(ColorTranslateMode & 1)
+							{
+								hsv = rgb_to_hsv(theTempColor);
+
+								if(hsv_y < 0.2)
+								{
+									if(hsv_z < 0.5)
+										s2 = strcat(s2, "^0");
+									else
+										s2 = strcat(s2, "^7");
+								}
+								else
+								{
+									if(hsv_x < 0.6)
+										s2 = strcat(s2, "^1");
+									else if(hsv_x < 1.33333333333333333333)
+										s2 = strcat(s2, "^3");
+									else if(hsv_x < 2.5)
+										s2 = strcat(s2, "^2");
+									else if(hsv_x < 3.33333333333333333333)
+										s2 = strcat(s2, "^5");
+									else if(hsv_x < 4.5)
+										s2 = strcat(s2, "^4");
+									else if(hsv_x < 5.5)
+										s2 = strcat(s2, "^6");
+									else
+										s2 = strcat(s2, "^1");
+								}
+							}
+
+							i += 3;
+						}
+						else
+						{
+							// blue missing
+							s2 = strcat(s2, substring(s, i, 4));
+							i += 2;
+						}
+					}
+					else
+					{
+						// green missing
+						s2 = strcat(s, substring(s2, i, 3));
+						i += 1;
+					}
+				}
+				else
+				{
+					// red missing
+					s2 = strcat(s, substring(s2, i, 2));
+				}
+			}
+			else
+			{
+				s2 = strcat(s2, ch, ch2);
+			}
+			++i;
+			continue;
+		}
+		s2 = strcat(s2, ch);
+	}
+
+	return s2;
+}

Modified: trunk/data/qcsrc/client/sbar.qc
===================================================================
--- trunk/data/qcsrc/client/sbar.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/sbar.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -615,7 +615,7 @@
 				sbar_field_icon2 = "gfx/sb_playercolor_pants";
 				sbar_field_icon2_rgb = colormapPaletteColor(mod(f, 16), 1);
 			}
-			return getplayerkey(pl.sv_entnum, "name");
+			return GetPlayerName(pl.sv_entnum);
 
 		case SP_FRAGS:
 			f = pl.(scores[SP_KILLS]);
@@ -978,7 +978,6 @@
 		{
 			if(pl.team != COLOR_SPECTATOR)
 				continue;
-			//drawcolorcodedstring(pos, getplayerkey(pl.sb_player, "name"), '8 8 0', 1, 0);
 			Sbar_PrintScoreboardItem(pos, pl, (pl.sv_entnum == player_localentnum - 1));
 			pos += '0 1.25 0' * sbar_fontsize_y;
 			++specs;
@@ -1335,7 +1334,7 @@
 		pos_x += 8;
 	} else
 		pos_x += 56;
-	drawcolorcodedstring(pos, getplayerkey(pl.sv_entnum, "name"), '8 8 0', 1, 0);
+	drawcolorcodedstring(pos, GetPlayerName(pl.sv_entnum), '8 8 0', 1, 0);
 }
 
 void Sbar_MiniscoreTeamItem(vector pos, float color, float frags, float is_self)
@@ -1476,7 +1475,7 @@
 		if(spectatee_status == -1)
 			s = "^1Observing";
 		else
-			s = strcat("^1Spectating ^7", getplayerkey(spectatee_status - 1, "name"));
+			s = strcat("^1Spectating ^7", GetPlayerName(spectatee_status - 1));
 		o = Sbar_DrawNoteLine(o, s);
 
 		if(spectatee_status == -1)

Modified: trunk/data/qcsrc/client/teamplay.qc
===================================================================
--- trunk/data/qcsrc/client/teamplay.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/client/teamplay.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -32,6 +32,11 @@
 		return GetPlayerColorForce(i);
 }
 
+string GetPlayerName(float i)
+{
+	return ColorTranslateRGB(getplayerkey(i, "name"));
+}
+
 vector GetTeamRGB(float color)
 {
 	switch(color)

Modified: trunk/data/qcsrc/common/util.qc
===================================================================
--- trunk/data/qcsrc/common/util.qc	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/common/util.qc	2008-12-29 19:02:22 UTC (rev 5352)
@@ -1158,102 +1158,139 @@
 						return 0;
 }
 
-vector rgb_to_hsl(vector rgb)
+float rgb_mi_ma_to_hue(vector rgb, float mi, float ma)
 {
-	float mi, ma;
-	vector hsl;
-
-	mi = min3(rgb_x, rgb_y, rgb_z);
-	ma = max3(rgb_x, rgb_y, rgb_z);
-
 	if(mi == ma)
-		hsl_x = 0;
+		return 0;
 	else if(ma == rgb_x)
-		hsl_x = (rgb_y - rgb_z) / (ma - mi);
+	{
+		if(rgb_y >= rgb_z)
+			return (rgb_y - rgb_z) / (ma - mi);
+		else
+			return (rgb_y - rgb_z) / (ma - mi) + 6;
+	}
 	else if(ma == rgb_y)
-		hsl_x = (rgb_z - rgb_x) / (ma - mi) + 2;
+		return (rgb_z - rgb_x) / (ma - mi) + 2;
 	else // if(ma == rgb_z)
-		hsl_x = (rgb_x - rgb_y) / (ma - mi) + 4;
-	if(hsl_x < 0)
-		hsl_x += 6;
-	
-	hsl_z = 0.5 * (mi + ma);
-
-	if(mi == ma)
-		hsl_y = 0;
-	else if(hsl_z <= 0.5)
-		hsl_y = (ma - mi) / (2*hsl_z);
-	else // if(hsl_z > 0.5)
-		hsl_y = (ma - mi) / (2 - 2*hsl_z);
-	
-	return hsl;
+		return (rgb_x - rgb_y) / (ma - mi) + 4;
 }
 
-vector hsl_to_rgb(vector hsl)
+vector hue_mi_ma_to_rgb(float hue, float mi, float ma)
 {
-	float mi, ma, maminusmi, h;
 	vector rgb;
 
-	if(hsl_z <= 0.5)
-		maminusmi = hsl_y * 2 * hsl_z;
-	else
-		maminusmi = hsl_y * (2 - 2 * hsl_z);
-	
-	// hsl_z     = 0.5 * mi + 0.5 * ma
-	// maminusmi =     - mi +       ma
-	mi = hsl_z - 0.5 * maminusmi;
-	ma = hsl_z + 0.5 * maminusmi;
+	hue -= 6 * floor(hue / 6);
 
-	h = hsl_x - 6 * floor(hsl_x / 6);
-
 	//else if(ma == rgb_x)
-	//	h = 60 * (rgb_y - rgb_z) / (ma - mi);
-	if(h <= 1)
+	//	hue = 60 * (rgb_y - rgb_z) / (ma - mi);
+	if(hue <= 1)
 	{
 		rgb_x = ma;
-		rgb_y = h * (ma - mi) + mi;
+		rgb_y = hue * (ma - mi) + mi;
 		rgb_z = mi;
 	}
 	//else if(ma == rgb_y)
-	//	h = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
-	else if(h <= 2)
+	//	hue = 60 * (rgb_z - rgb_x) / (ma - mi) + 120;
+	else if(hue <= 2)
 	{
-		rgb_x = (2 - h) * (ma - mi) + mi;
+		rgb_x = (2 - hue) * (ma - mi) + mi;
 		rgb_y = ma;
 		rgb_z = mi;
 	}
-	else if(h <= 3)
+	else if(hue <= 3)
 	{
 		rgb_x = mi;
 		rgb_y = ma;
-		rgb_z = (h - 2) * (ma - mi) + mi;
+		rgb_z = (hue - 2) * (ma - mi) + mi;
 	}
 	//else // if(ma == rgb_z)
-	//	h = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
-	else if(h <= 4)
+	//	hue = 60 * (rgb_x - rgb_y) / (ma - mi) + 240;
+	else if(hue <= 4)
 	{
 		rgb_x = mi;
-		rgb_y = (4 - h) * (ma - mi) + mi;
+		rgb_y = (4 - hue) * (ma - mi) + mi;
 		rgb_z = ma;
 	}
-	else if(h <= 5)
+	else if(hue <= 5)
 	{
-		rgb_x = (h - 4) * (ma - mi) + mi;
+		rgb_x = (hue - 4) * (ma - mi) + mi;
 		rgb_y = mi;
 		rgb_z = ma;
 	}
 	//else if(ma == rgb_x)
-	//	h = 60 * (rgb_y - rgb_z) / (ma - mi);
-	else // if(h <= 6)
+	//	hue = 60 * (rgb_y - rgb_z) / (ma - mi);
+	else // if(hue <= 6)
 	{
 		rgb_x = ma;
 		rgb_y = mi;
-		rgb_z = (6 - h) * (ma - mi) + mi;
+		rgb_z = (6 - hue) * (ma - mi) + mi;
 	}
 
 	return rgb;
 }
 
+vector rgb_to_hsv(vector rgb)
+{
+	float mi, ma;
+	vector hsv;
+
+	mi = min3(rgb_x, rgb_y, rgb_z);
+	ma = max3(rgb_x, rgb_y, rgb_z);
+
+	hsv_x = rgb_mi_ma_to_hue(rgb, mi, ma);
+	hsv_z = ma;
+
+	if(ma == 0)
+		hsv_y = 0;
+	else
+		hsv_y = 1 - mi/ma;
+	
+	return hsv;
+}
+
+vector hsv_to_rgb(vector hsv)
+{
+	return hue_mi_ma_to_rgb(hsv_x, hsv_z * (1 - hsv_y), hsv_z);
+}
+
+vector rgb_to_hsl(vector rgb)
+{
+	float mi, ma;
+	vector hsl;
+
+	mi = min3(rgb_x, rgb_y, rgb_z);
+	ma = max3(rgb_x, rgb_y, rgb_z);
+
+	hsl_x = rgb_mi_ma_to_hue(rgb, mi, ma);
+	
+	hsl_z = 0.5 * (mi + ma);
+	if(mi == ma)
+		hsl_y = 0;
+	else if(hsl_z <= 0.5)
+		hsl_y = (ma - mi) / (2*hsl_z);
+	else // if(hsl_z > 0.5)
+		hsl_y = (ma - mi) / (2 - 2*hsl_z);
+	
+	return hsl;
+}
+
+vector hsl_to_rgb(vector hsl)
+{
+	float mi, ma, maminusmi;
+
+	if(hsl_z <= 0.5)
+		maminusmi = hsl_y * 2 * hsl_z;
+	else
+		maminusmi = hsl_y * (2 - 2 * hsl_z);
+	
+	// hsl_z     = 0.5 * mi + 0.5 * ma
+	// maminusmi =     - mi +       ma
+	mi = hsl_z - 0.5 * maminusmi;
+	ma = hsl_z + 0.5 * maminusmi;
+
+	return hue_mi_ma_to_rgb(hsl_x, mi, ma);
+}
+
 string rgb_to_hexcolor(vector rgb)
 {
 	return

Modified: trunk/data/qcsrc/common/util.qh
===================================================================
--- trunk/data/qcsrc/common/util.qh	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/common/util.qh	2008-12-29 19:02:22 UTC (rev 5352)
@@ -129,4 +129,6 @@
 
 vector rgb_to_hsl(vector rgb);
 vector hsl_to_rgb(vector hsl);
+vector rgb_to_hsv(vector rgb);
+vector hsv_to_rgb(vector hsv);
 string rgb_to_hexcolor(vector rgb);

Modified: trunk/data/qcsrc/menu/item/inputbox.c
===================================================================
--- trunk/data/qcsrc/menu/item/inputbox.c	2008-12-29 18:05:28 UTC (rev 5351)
+++ trunk/data/qcsrc/menu/item/inputbox.c	2008-12-29 19:02:22 UTC (rev 5352)
@@ -161,7 +161,7 @@
 	if(me.editColorCodes)
 	{
 		string ch, ch2;
-		float i;
+		float i, n;
 		vector theColor;
 		float theAlpha;    //float theVariableAlpha;
 		vector p;
@@ -172,7 +172,8 @@
 		theColor = '1 1 1';
 		theAlpha = 1;    //theVariableAlpha = 1; // changes when ^ax found
 		
-		for(i = 0; i < strlen(me.text); ++i)
+		n = strlen(me.text);
+		for(i = 0; i < n; ++i)
 		{
 			ch = substring(me.text, i, 1);
 			if(ch == "^")




More information about the nexuiz-commits mailing list