X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fscoreboard.qc;h=b037d03d20cb35a4431315f87bc6ade863153b8b;hb=fbb52b893f7be6bf4073f1853761c4f2fc11a343;hp=e4e3767f1c2a5207c107c13ea607d5df4d8d76fb;hpb=e7c63b4a159ba5bed1a4e35d1df9ca19cdef95a2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index e4e3767f1..b037d03d2 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -9,7 +9,7 @@ float scoreboard_alpha_name_self; void drawstringright(vector, string, vector, vector, float, float); void drawstringcenter(vector, string, vector, vector, float, float); -float SCOREBOARD_OFFSET = 50; +const float SCOREBOARD_OFFSET = 50; // wrapper to put all possible scores titles through gettext string TranslateScoresLabel(string l) @@ -36,6 +36,7 @@ string TranslateScoresLabel(string l) case "lives": return CTX(_("SCO^lives")); case "losses": return CTX(_("SCO^losses")); case "name": return CTX(_("SCO^name")); + case "sum": return CTX(_("SCO^sum")); case "nick": return CTX(_("SCO^nick")); case "objectives": return CTX(_("SCO^objectives")); case "pickups": return CTX(_("SCO^pickups")); @@ -152,16 +153,16 @@ float HUD_ComparePlayerScores(entity left, entity right) vr = GetPlayerColor(right.sv_entnum); if(!left.gotscores) - vl = FL_SPECTATOR; + vl = NUM_SPECTATOR; if(!right.gotscores) - vr = FL_SPECTATOR; + vr = NUM_SPECTATOR; if(vl > vr) return true; if(vl < vr) return false; - if(vl == FL_SPECTATOR) + if(vl == NUM_SPECTATOR) { // FIRST the one with scores (spectators), THEN the ones without (downloaders) // no other sorting @@ -207,9 +208,9 @@ float HUD_CompareTeamScores(entity left, entity right) { float i, r; - if(left.team == FL_SPECTATOR) + if(left.team == NUM_SPECTATOR) return 1; - if(right.team == FL_SPECTATOR) + if(right.team == NUM_SPECTATOR) return 0; r = HUD_CompareScore(left.teamscores[ts_primary], right.teamscores[ts_primary], teamscores_flags[ts_primary]); @@ -263,6 +264,7 @@ void Cmd_HUD_Help() print(_("^3suicides^7 Number of suicides\n")); print(_("^3frags^7 kills - suicides\n")); print(_("^3kd^7 The kill-death ratio\n")); + print(_("^3sum^7 frags - deaths\n")); print(_("^3caps^7 How often a flag (CTF) or a key (KeyHunt) was captured\n")); print(_("^3pickups^7 How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up\n")); print(_("^3captime^7 Time of fastest cap (CTF)\n")); @@ -304,6 +306,7 @@ string HUD_DefaultColumnLayout() return strcat( // fteqcc sucks "ping pl name | ", "-teams,race,lms/kills +freezetag/kills -teams,lms/deaths +freezetag/deaths -teams,lms,race,ka/suicides +freezetag/suicides -race,dm,tdm,ka,freezetag/frags ", // tdm already has this in "score" + "+tdm/kills +tdm/deaths +tdm/suicides ", "+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ", "+lms/lives +lms/rank ", "+kh/caps +kh/pushes +kh/destroyed ", @@ -372,7 +375,7 @@ void Cmd_HUD_SetFields(float argc) pattern = substring(str, 0, slash); str = substring(str, slash + 1, strlen(str) - (slash + 1)); - if not(isGametypeInFilter(gametype, teamplay, FALSE, pattern)) + if (!isGametypeInFilter(gametype, teamplay, FALSE, pattern)) continue; } @@ -387,6 +390,8 @@ void Cmd_HUD_SetFields(float argc) hud_field[hud_num_fields] = SP_PL; } else if(str == "kd" || str == "kdr" || str == "kdratio" || str == "k/d") { hud_field[hud_num_fields] = SP_KDRATIO; + } else if(str == "sum" || str == "diff" || str == "f-d") { + hud_field[hud_num_fields] = SP_SUM; } else if(str == "name" || str == "nick") { hud_field[hud_num_fields] = SP_NAME; have_name = 1; @@ -404,7 +409,7 @@ void Cmd_HUD_SetFields(float argc) } else { - if not(nocomplain) + if (!nocomplain) print(sprintf("^1Error:^7 Unknown score field: '%s'\n", str)); continue; } @@ -442,7 +447,7 @@ void Cmd_HUD_SetFields(float argc) hud_title[0] = strzone(TranslateScoresLabel("name")); hud_field[0] = SP_NAME; ++hud_num_fields; - print(sprintf(_("fixed missing field '%s'\n"), "name")); + print("fixed missing field 'name'\n"); if(!have_separator) { @@ -457,7 +462,7 @@ void Cmd_HUD_SetFields(float argc) hud_field[1] = SP_SEPARATOR; hud_size[1] = stringwidth("|", FALSE, hud_fontsize); ++hud_num_fields; - print(sprintf(_("fixed missing field '%s'\n"), "|")); + print("fixed missing field '|'\n"); } } else if(!have_separator) @@ -467,7 +472,7 @@ void Cmd_HUD_SetFields(float argc) hud_size[hud_num_fields] = stringwidth("|", FALSE, hud_fontsize); hud_field[hud_num_fields] = SP_SEPARATOR; ++hud_num_fields; - print(sprintf(_("fixed missing field '%s'\n"), "|")); + print("fixed missing field '|'\n"); } if(!have_secondary) { @@ -476,7 +481,7 @@ void Cmd_HUD_SetFields(float argc) hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize); hud_field[hud_num_fields] = ps_secondary; ++hud_num_fields; - print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_secondary])); + print(sprintf("fixed missing field '%s'\n", scores_label[ps_secondary])); } if(!have_primary) { @@ -485,7 +490,7 @@ void Cmd_HUD_SetFields(float argc) hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize); hud_field[hud_num_fields] = ps_primary; ++hud_num_fields; - print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_primary])); + print(sprintf("fixed missing field '%s'\n", scores_label[ps_primary])); } } @@ -521,7 +526,7 @@ string HUD_GetField(entity pl, float field) switch(field) { case SP_PING: - if not(pl.gotscores) + if (!pl.gotscores) return "\xEE\x82\x8D\xEE\x82\x8D\xEE\x82\x8D"; // >>> sign //str = getplayerkeyvalue(pl.sv_entnum, "ping"); f = pl.ping; @@ -532,7 +537,7 @@ string HUD_GetField(entity pl, float field) return ftos(f); case SP_PL: - if not(pl.gotscores) + if (!pl.gotscores) return _("N/A"); f = pl.ping_packetloss; tmp = pl.ping_movementloss; @@ -582,6 +587,19 @@ string HUD_GetField(entity pl, float field) str = sprintf("%.1f", num/denom); return str; + case SP_SUM: + f = pl.(scores[SP_KILLS]); + f -= pl.(scores[SP_DEATHS]); + + if(f > 0) { + hud_field_rgb = '0 1 0'; + } else if(f == 0) { + hud_field_rgb = '1 1 1'; + } else { + hud_field_rgb = '1 0 0'; + } + return ftos(f); + default: tmp = pl.(scores[field]); f = scores_flags[field]; @@ -673,7 +691,7 @@ void HUD_PrintScoreboardItem(vector pos, entity pl, float is_self, float pl_numb string str; float i, field; float is_spec; - is_spec = (GetPlayerColor(pl.sv_entnum) == FL_SPECTATOR); + is_spec = (GetPlayerColor(pl.sv_entnum) == NUM_SPECTATOR); if((rgb == '1 1 1') && (!is_spec)) { rgb_x = autocvar_scoreboard_color_bg_r + 0.5; @@ -917,7 +935,7 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz else for(pl = players.sort_next; pl; pl = pl.sort_next) { - if(pl.team == FL_SPECTATOR) + if(pl.team == NUM_SPECTATOR) continue; HUD_PrintScoreboardItem(pos, pl, (pl.sv_entnum == player_localnum), i); pos_y += 1.25 * hud_fontsize_y; @@ -947,7 +965,6 @@ float HUD_WouldDrawScoreboard() { return 0; } -float g_minstagib; float average_accuracy; vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) { @@ -962,6 +979,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) float fontsize = height * 1/3; float weapon_height = height * 2/3; float weapon_width = sbwidth / weapon_cnt; + float g_minstagib = 0; drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness; @@ -1006,7 +1024,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) for(i = WEP_FIRST; i <= WEP_LAST; ++i) { self = get_weaponinfo(i); - if not(self.weapon) + if (!self.weapon) continue; if ((i == WEP_NEX && g_minstagib) || i == WEP_PORTO || (i == WEP_MINSTANEX && !g_minstagib) || i == WEP_TUBA) // skip port-o-launch, nex || minstanex and tuba continue; @@ -1063,7 +1081,7 @@ vector HUD_DrawKeyValue(vector pos, string key, string value) { drawstring(pos, value, hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_x = px; pos_y+= hud_fontsize_y; - + return pos; } @@ -1080,14 +1098,14 @@ vector HUD_DrawMapStats(vector pos, vector rgb, vector bg_size) { rows = (stat_secrets_total ? 1 : 0); // if no rows, return - if not(rows) + if (!rows) return pos; // draw table header drawstring(pos, _("Map stats:"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness; - - // draw table + + // draw table vector tmp = '0 0 0'; tmp_x = sbwidth; tmp_y = hud_fontsize_y * rows; @@ -1101,7 +1119,7 @@ vector HUD_DrawMapStats(vector pos, vector rgb, vector bg_size) { // draw secrets val = sprintf("%d/%d", stat_secrets_found, stat_secrets_total); pos = HUD_DrawKeyValue(pos, _("Secrets found:"), val); - + // update position pos_y += 1.25 * hud_fontsize_y; return pos; @@ -1120,7 +1138,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ return pos; float is_spec; - is_spec = (GetPlayerColor(pl.sv_entnum) == FL_SPECTATOR); + is_spec = (GetPlayerColor(pl.sv_entnum) == NUM_SPECTATOR); vector hl_rgb; hl_rgb_x = autocvar_scoreboard_color_bg_r + 0.5; hl_rgb_y = autocvar_scoreboard_color_bg_g + 0.5; @@ -1148,7 +1166,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ if (t == 0) continue; n = grecordholder[i]; - p = race_PlaceName(i+1); + p = count_ordinal(i+1); if(grecordholder[i] == GetPlayerName(player_localnum)) drawfill(pos, '1 0 0' * sbwidth + '0 1.25 0' * hud_fontsize_y, hl_rgb, scoreboard_highlight_alpha_self, DRAWFLAG_NORMAL); else if(!mod(i, 2) && scoreboard_highlight) @@ -1189,7 +1207,7 @@ void HUD_DrawScoreboard() scoreboard_fade_alpha = 0; } - if not(scoreboard_fade_alpha) + if (!scoreboard_fade_alpha) return; HUD_UpdatePlayerTeams(); @@ -1237,7 +1255,7 @@ void HUD_DrawScoreboard() team_score_baseoffset = eY * (2 * autocvar_scoreboard_border_thickness + hud_fontsize_y) - eX * (autocvar_scoreboard_border_thickness + hud_fontsize_x * 0.25); for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == FL_SPECTATOR) + if(tm.team == NUM_SPECTATOR) continue; draw_beginBoldFont(); @@ -1273,7 +1291,7 @@ void HUD_DrawScoreboard() for(tm = teams.sort_next; tm; tm = tm.sort_next) { - if(tm.team == FL_SPECTATOR) + if(tm.team == NUM_SPECTATOR) continue; pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size); @@ -1298,7 +1316,7 @@ void HUD_DrawScoreboard() pos = HUD_DrawScoreboardAccuracyStats(pos, rgb, bg_size); } - + if(teamplay) pos = HUD_DrawMapStats(pos, Team_ColorRGB(myteam), bg_size); else @@ -1310,7 +1328,7 @@ void HUD_DrawScoreboard() tmp = pos; for(pl = players.sort_next; pl; pl = pl.sort_next) { - if(pl.team != FL_SPECTATOR) + if(pl.team != NUM_SPECTATOR) continue; pos_y += 1.25 * hud_fontsize_y; HUD_PrintScoreboardItem(pos, pl, (pl.sv_entnum == player_localnum), specs); @@ -1346,14 +1364,14 @@ void HUD_DrawScoreboard() str = strcat(str, _(" or")); if(teamplay) { - str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], fl), + str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], fl), (teamscores_label[ts_primary] == "score") ? CTX(_("SCO^points")) : (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) : TranslateScoresLabel(teamscores_label[ts_primary]))); } else { - str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(scores_flags[ps_primary], fl), + str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(scores_flags[ps_primary], fl), (scores_label[ps_primary] == "score") ? CTX(_("SCO^points")) : (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) : TranslateScoresLabel(scores_label[ps_primary]))); @@ -1365,14 +1383,14 @@ void HUD_DrawScoreboard() str = strcat(str, _(" or")); if(teamplay) { - str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], ll), + str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], ll), (teamscores_label[ts_primary] == "score") ? CTX(_("SCO^points")) : (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) : TranslateScoresLabel(teamscores_label[ts_primary]))); } else { - str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(scores_flags[ps_primary], ll), + str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(scores_flags[ps_primary], ll), (scores_label[ps_primary] == "score") ? CTX(_("SCO^points")) : (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) : TranslateScoresLabel(scores_label[ps_primary]))); @@ -1392,11 +1410,25 @@ void HUD_DrawScoreboard() // a negative number means we are awaiting respawn, time value is still the same respawn_time *= -1; // remove mark now that we checked it respawn_time = max(time, respawn_time); // don't show a negative value while the server is respawning the player (lag) - - str = sprintf(_("^1Respawning in ^3%s^1 seconds..."), ftos_decimals(respawn_time - time, autocvar_scoreboard_respawntime_decimals)); + + str = sprintf(_("^1Respawning in ^3%s^1..."), + (autocvar_scoreboard_respawntime_decimals ? + count_seconds_decs(respawn_time - time, autocvar_scoreboard_respawntime_decimals) + : + count_seconds(respawn_time - time) + ) + ); } else if(time < respawn_time) - str = sprintf(_("You are dead, wait ^3%s^7 seconds before respawning"), ftos_decimals(respawn_time - time, autocvar_scoreboard_respawntime_decimals)); + { + str = sprintf(_("You are dead, wait ^3%s^7 before respawning"), + (autocvar_scoreboard_respawntime_decimals ? + count_seconds_decs(respawn_time - time, autocvar_scoreboard_respawntime_decimals) + : + count_seconds(respawn_time - time) + ) + ); + } else if(time >= respawn_time) str = sprintf(_("You are dead, press ^2%s^7 to respawn"), getcommandkey("jump", "+jump"));