From 315dd854a3d9bc2d3d45101c19d0f3141fd064da Mon Sep 17 00:00:00 2001 From: div0 Date: Mon, 29 Dec 2008 19:02:22 +0000 Subject: [PATCH] Translate color codes for old clients git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5352 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/defaultNexuiz.cfg | 2 + data/qcsrc/client/Main.qc | 10 +- data/qcsrc/client/View.qc | 1 + data/qcsrc/client/ctf.qc | 2 +- data/qcsrc/client/miscfunctions.qc | 122 ++++++++++++++++++++++++ data/qcsrc/client/sbar.qc | 7 +- data/qcsrc/client/teamplay.qc | 5 + data/qcsrc/common/util.qc | 143 ++++++++++++++++++----------- data/qcsrc/common/util.qh | 2 + data/qcsrc/menu/item/inputbox.c | 5 +- 10 files changed, 234 insertions(+), 65 deletions(-) diff --git a/data/defaultNexuiz.cfg b/data/defaultNexuiz.cfg index e81b3dbc9..80fb0b376 100644 --- a/data/defaultNexuiz.cfg +++ b/data/defaultNexuiz.cfg @@ -1282,3 +1282,5 @@ set g_ballistics_force_uzi_speed 12000 // speed of uzi bullets if g_ballistics_f 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!) diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index e6550d005..2bd2f4938 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -200,7 +200,7 @@ void Playerchecker_Think() for(i = 0; i < maxclients; ++i) { e = playerslots[i]; - if(getplayerkey(i, "name") == "") + if(GetPlayerName(i) == "") { if(e.sort_prev) { @@ -588,12 +588,12 @@ void CSQC_Parse_StuffCmd(string strMessage) // 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 @@ void Net_ReadRace() 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 @@ void Net_ReadRace() 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: diff --git a/data/qcsrc/client/View.qc b/data/qcsrc/client/View.qc index c48719b20..f08638839 100644 --- a/data/qcsrc/client/View.qc +++ b/data/qcsrc/client/View.qc @@ -264,6 +264,7 @@ void CSQC_UpdateView(float w, float h) 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) diff --git a/data/qcsrc/client/ctf.qc b/data/qcsrc/client/ctf.qc index 8aa778a80..eed2fb151 100644 --- a/data/qcsrc/client/ctf.qc +++ b/data/qcsrc/client/ctf.qc @@ -48,7 +48,7 @@ void() order_menu_render = ++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; diff --git a/data/qcsrc/client/miscfunctions.qc b/data/qcsrc/client/miscfunctions.qc index 89b85178e..d4a9762c4 100644 --- a/data/qcsrc/client/miscfunctions.qc +++ b/data/qcsrc/client/miscfunctions.qc @@ -260,3 +260,125 @@ vector rotate(vector v, float a) 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; +} diff --git a/data/qcsrc/client/sbar.qc b/data/qcsrc/client/sbar.qc index f501b4685..c1fce1e46 100644 --- a/data/qcsrc/client/sbar.qc +++ b/data/qcsrc/client/sbar.qc @@ -615,7 +615,7 @@ string Sbar_GetField(entity pl, float field) 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 @@ void Sbar_DrawScoreboard() { 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 @@ void Sbar_MiniscoreItem(vector pos, entity pl, float is_self) 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 @@ void Sbar_Draw (void) 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) diff --git a/data/qcsrc/client/teamplay.qc b/data/qcsrc/client/teamplay.qc index 7b996116b..20b2de533 100644 --- a/data/qcsrc/client/teamplay.qc +++ b/data/qcsrc/client/teamplay.qc @@ -32,6 +32,11 @@ float GetPlayerColor(float i) return GetPlayerColorForce(i); } +string GetPlayerName(float i) +{ + return ColorTranslateRGB(getplayerkey(i, "name")); +} + vector GetTeamRGB(float color) { switch(color) diff --git a/data/qcsrc/common/util.qc b/data/qcsrc/common/util.qc index 1905ba365..967f9d603 100644 --- a/data/qcsrc/common/util.qc +++ b/data/qcsrc/common/util.qc @@ -1158,102 +1158,139 @@ float log2of(float x) 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; - - h = hsl_x - 6 * floor(hsl_x / 6); + hue -= 6 * floor(hue / 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 diff --git a/data/qcsrc/common/util.qh b/data/qcsrc/common/util.qh index 25cf459aa..2968cdc83 100644 --- a/data/qcsrc/common/util.qh +++ b/data/qcsrc/common/util.qh @@ -129,4 +129,6 @@ string HEXDIGITS = "0123456789ABCDEF0123456789abcdef"; 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); diff --git a/data/qcsrc/menu/item/inputbox.c b/data/qcsrc/menu/item/inputbox.c index 9035abec9..a0d7c5791 100644 --- a/data/qcsrc/menu/item/inputbox.c +++ b/data/qcsrc/menu/item/inputbox.c @@ -161,7 +161,7 @@ void drawInputBox(entity me) if(me.editColorCodes) { string ch, ch2; - float i; + float i, n; vector theColor; float theAlpha; //float theVariableAlpha; vector p; @@ -172,7 +172,8 @@ void drawInputBox(entity me) 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 == "^") -- 2.39.2