X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fscoreboard.qc;h=8e024ead5b0c7fdeb36865a802c9378bf55ba7bf;hb=30b10531b2a91c90b25120a5b339f04f35135eb0;hp=f03ee9965c3e7eccd3ea41008559157a2141a986;hpb=d0168920d1b49c61e7867c7acac8a76fd32dc8e2;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index f03ee9965..8e024ead5 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -11,6 +11,47 @@ void drawstringcenter(vector, string, vector, vector, float, float); float SCOREBOARD_OFFSET = 50; +// wrapper to put all possible scores titles through gettext +string TranslateScoresLabel(string l) +{ + switch(l) + { + case "bckills": return CTX(_("SCO^bckills")); + case "bctime": return CTX(_("SCO^bctime")); + case "caps": return CTX(_("SCO^caps")); + case "deaths": return CTX(_("SCO^deaths")); + case "destroyed": return CTX(_("SCO^destroyed")); + case "drops": return CTX(_("SCO^drops")); + case "faults": return CTX(_("SCO^faults")); + case "fckills": return CTX(_("SCO^fckills")); + case "goals": return CTX(_("SCO^goals")); + case "kckills": return CTX(_("SCO^kckills")); + case "kdratio": return CTX(_("SCO^kdratio")); + case "k/d": return CTX(_("SCO^k/d")); + case "kd": return CTX(_("SCO^kd")); + case "kdr": return CTX(_("SCO^kdr")); + case "kills": return CTX(_("SCO^kills")); + case "laps": return CTX(_("SCO^laps")); + case "lives": return CTX(_("SCO^lives")); + case "losses": return CTX(_("SCO^losses")); + case "name": return CTX(_("SCO^name")); + case "nick": return CTX(_("SCO^nick")); + case "objectives": return CTX(_("SCO^objectives")); + case "pickups": return CTX(_("SCO^pickups")); + case "ping": return CTX(_("SCO^ping")); + case "pl": return CTX(_("SCO^pl")); + case "pushes": return CTX(_("SCO^pushes")); + case "rank": return CTX(_("SCO^rank")); + case "returns": return CTX(_("SCO^returns")); + case "revivals": return CTX(_("SCO^revivals")); + case "score": return CTX(_("SCO^score")); + case "suicides": return CTX(_("SCO^suicides")); + case "takes": return CTX(_("SCO^takes")); + case "ticks": return CTX(_("SCO^ticks")); + default: return l; + } +} + void MapVote_Draw(); void HUD_FinaleOverlay() { @@ -195,65 +236,67 @@ void HUD_UpdateTeamPos(entity Team) void Cmd_HUD_Help(float argc) { - print("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"); - print("^3|---------------------------------------------------------------|\n"); - print("Usage:\n"); - print("^2scoreboard_columns_set default\n"); - print("^2scoreboard_columns_set ^7filed1 field2 ...\n"); - print("The following field names are recognized (case insensitive):\n"); - print("You can use a ^3|^7 to start the right-aligned fields.\n\n"); - - print("^3name^7 or ^3nick^7 Name of a player\n"); - print("^3ping^7 Ping time\n"); - print("^3pl^7 Packet loss\n"); - print("^3kills^7 Number of kills\n"); - print("^3deaths^7 Number of deaths\n"); - print("^3suicides^7 Number of suicides\n"); - print("^3frags^7 kills - suicides\n"); - print("^3kd^7 The kill-death ratio\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) was picked up\n"); - print("^3fckills^7 Number of flag carrier kills\n"); - print("^3returns^7 Number of flag returns\n"); - print("^3drops^7 Number of flag drops\n"); - print("^3lives^7 Number of lives (LMS)\n"); - print("^3rank^7 Player rank\n"); - print("^3pushes^7 Number of players pushed into void\n"); - print("^3destroyed^7 Number of keys destroyed by pushing them into void\n"); - print("^3kckills^7 Number of keys carrier kills\n"); - print("^3losses^7 Number of times a key was lost\n"); - print("^3laps^7 Number of laps finished (race/cts)\n"); - print("^3time^7 Total time raced (race/cts)\n"); - print("^3fastest^7 Time of fastest lap (race/cts)\n"); - print("^3ticks^7 Number of ticks (DOM)\n"); - print("^3takes^7 Number of domination points taken (DOM)\n"); - print("^3score^7 Total score\n\n"); - - print("Before a field you can put a + or - sign, then a comma separated list\n"); - print("of game types, then a slash, to make the field show up only in these\n"); - print("or in all but these game types. You can also specify 'all' as a\n"); - print("field to show all fields available for the current game mode.\n\n"); - - print("The special game type names 'teams' and 'noteams' can be used to\n"); - print("include/exclude ALL teams/noteams game modes.\n\n"); - - print("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"); - print("will display name, ping and pl aligned to the left, and the fields\n"); - print("right of the vertical bar aligned to the right.\n"); - print("'field3' will only be shown in CTF, and 'field4' will be shown in all\n"); - print("other gamemodes except DM.\n"); + print(_("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n")); + print(_("^3|---------------------------------------------------------------|\n")); + print(_("Usage:\n")); + print(_("^2scoreboard_columns_set default\n")); + print(_("^2scoreboard_columns_set ^7filed1 field2 ...\n")); + print(_("The following field names are recognized (case insensitive):\n")); + print(_("You can use a ^3|^7 to start the right-aligned fields.\n\n")); + + print(_("^3name^7 or ^3nick^7 Name of a player\n")); + print(_("^3ping^7 Ping time\n")); + print(_("^3pl^7 Packet loss\n")); + print(_("^3kills^7 Number of kills\n")); + print(_("^3deaths^7 Number of deaths\n")); + print(_("^3suicides^7 Number of suicides\n")); + print(_("^3frags^7 kills - suicides\n")); + print(_("^3kd^7 The kill-death ratio\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(_("^3fckills^7 Number of flag carrier kills\n")); + print(_("^3returns^7 Number of flag returns\n")); + print(_("^3drops^7 Number of flag drops\n")); + print(_("^3lives^7 Number of lives (LMS)\n")); + print(_("^3rank^7 Player rank\n")); + print(_("^3pushes^7 Number of players pushed into void\n")); + print(_("^3destroyed^7 Number of keys destroyed by pushing them into void\n")); + print(_("^3kckills^7 Number of keys carrier kills\n")); + print(_("^3losses^7 Number of times a key was lost\n")); + print(_("^3laps^7 Number of laps finished (race/cts)\n")); + print(_("^3time^7 Total time raced (race/cts)\n")); + print(_("^3fastest^7 Time of fastest lap (race/cts)\n")); + print(_("^3ticks^7 Number of ticks (DOM)\n")); + print(_("^3takes^7 Number of domination points taken (DOM)\n")); + print(_("^3bckills^7 Number of ball carrier kills\n")); + print(_("^3bctime^7 Total amount of time holding the ball in Keepaway\n")); + print(_("^3score^7 Total score\n\n")); + + print(_("Before a field you can put a + or - sign, then a comma separated list\n" + "of game types, then a slash, to make the field show up only in these\n" + "or in all but these game types. You can also specify 'all' as a\n" + "field to show all fields available for the current game mode.\n\n")); + + print(_("The special game type names 'teams' and 'noteams' can be used to\n" + "include/exclude ALL teams/noteams game modes.\n\n")); + + print(_("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n")); + print(_("will display name, ping and pl aligned to the left, and the fields\n" + "right of the vertical bar aligned to the right.\n")); + print(_("'field3' will only be shown in CTF, and 'field4' will be shown in all\n" + "other gamemodes except DM.\n")); } string HUD_DefaultColumnLayout() { return strcat( // fteqcc sucks "ping pl name | ", - "-teams,race,lms/kills -teams,lms/deaths -teams,lms,race,ka/suicides -race,dm,tdm,ka/frags ", // tdm already has this in "score" + "-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" "+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns ", "+lms/lives +lms/rank ", "+kh/caps +kh/pushes +kh/destroyed ", "?+race/laps ?+race/time ?+race/fastest ", - "+as/objectives +nexball/faults +nexball/goals +ka/drops +ka/pickups +ka/bckills ", + "+as/objectives +nexball/faults +nexball/goals +ka/pickups +ka/bckills +ka/bctime +freezetag/revivals ", "-lms,race,nexball/score"); } @@ -296,7 +339,6 @@ void Cmd_HUD_SetFields(float argc) hud_num_fields = 0; - drawfont = hud_font; hud_fontsize = HUD_GetFontsize("hud_fontsize"); for(i = 0; i < argc - 1; ++i) @@ -317,13 +359,13 @@ 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, pattern)) + if not(isGametypeInFilter(gametype, teamplay, FALSE, pattern)) continue; } strunzone(hud_title[hud_num_fields]); - hud_title[hud_num_fields] = strzone(str); - hud_size[hud_num_fields] = stringwidth(str, FALSE, hud_fontsize); + hud_title[hud_num_fields] = strzone(TranslateScoresLabel(str)); + hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize); str = strtolower(str); if(str == "ping") { @@ -350,7 +392,7 @@ void Cmd_HUD_SetFields(float argc) else { if not(nocomplain) - print(strcat("^1Error:^7 Unknown score field: '", str, "'\n")); + print(sprintf("^1Error:^7 Unknown score field: '%s'\n", str)); continue; } :found @@ -384,10 +426,10 @@ void Cmd_HUD_SetFields(float argc) hud_size[i] = hud_size[i-1]; hud_field[i] = hud_field[i-1]; } - hud_title[0] = strzone("name"); + hud_title[0] = strzone(TranslateScoresLabel("name")); hud_field[0] = SP_NAME; ++hud_num_fields; - print("fixed missing field 'name'\n"); + print(sprintf(_("fixed missing field '%s'\n"), "name")); if(!have_separator) { @@ -402,7 +444,7 @@ void Cmd_HUD_SetFields(float argc) hud_field[1] = SP_SEPARATOR; hud_size[1] = stringwidth("|", FALSE, hud_fontsize); ++hud_num_fields; - print("fixed missing field '|'\n"); + print(sprintf(_("fixed missing field '%s'\n"), "|")); } } else if(!have_separator) @@ -412,25 +454,25 @@ 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("fixed missing field '|'\n"); + print(sprintf(_("fixed missing field '%s'\n"), "|")); } if(!have_secondary) { strunzone(hud_title[hud_num_fields]); - hud_title[hud_num_fields] = strzone(scores_label[ps_secondary]); + hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_secondary])); 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("fixed missing field '", scores_label[ps_secondary], "'\n"); + print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_secondary])); } if(!have_primary) { strunzone(hud_title[hud_num_fields]); - hud_title[hud_num_fields] = strzone(scores_label[ps_primary]); + hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_primary])); 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("fixed missing field '", scores_label[ps_primary], "'\n"); + print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_primary])); } } @@ -466,18 +508,18 @@ string HUD_GetField(entity pl, float field) { case SP_PING: if not(pl.gotscores) - return "\x8D\x8D\x8D"; // >>> sign + return "\xEE\x82\x8D\xEE\x82\x8D\xEE\x82\x8D"; // >>> sign //str = getplayerkey(pl.sv_entnum, "ping"); f = pl.ping; if(f == 0) - return "N/A"; + return _("N/A"); tmp = max(0, min(220, f-80)) / 220; hud_field_rgb = '1 1 1' - '0 1 1'*tmp; return ftos(f); case SP_PL: if not(pl.gotscores) - return "N/A"; + return _("N/A"); f = pl.ping_packetloss; tmp = pl.ping_movementloss; if(f == 0 && tmp == 0) @@ -518,16 +560,12 @@ string HUD_GetField(entity pl, float field) if(denom == 0) { hud_field_rgb = '0 1 0'; - str = ftos(num); + str = sprintf("%d", num); } else if(num <= 0) { hud_field_rgb = '1 0 0'; - str = ftos(num/denom); + str = sprintf("%.1f", num/denom); } else - str = ftos(num/denom); - - tmp = strstrofs(str, ".", 0); - if(tmp > 0) - str = substring(str, 0, tmp+2); + str = sprintf("%.1f", num/denom); return str; default: @@ -883,7 +921,9 @@ float HUD_WouldDrawScoreboard() { return 1; else if (intermission == 1) return 1; - else if (getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS) + else if (intermission == 2) + return 0; + else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS) return 1; else if (scoreboard_showscores_force) return 1; @@ -906,7 +946,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) float weapon_height = height * 2/3; float weapon_width = sbwidth / weapon_cnt; - drawstring(pos, strcat("Accuracy stats (average ", ftos(average_accuracy), "%)"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + 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; vector tmp; tmp_x = sbwidth; @@ -931,7 +971,6 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) drawfill(pos + '0 1 0' * weapon_height + '0 1 0' * height * i, '1 0 0' * sbwidth + '0 1 0' * fontsize, '1 1 1', scoreboard_highlight_alpha, DRAWFLAG_NORMAL); } - drawfont = hud_bigfont; average_accuracy = 0; float weapons_with_stats; weapons_with_stats = 0; @@ -972,7 +1011,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy string s; - s = sprintf("%d%%", weapon_stats*100); + s = sprintf(_("%d%%"), weapon_stats*100); float padding; padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value @@ -1000,7 +1039,6 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) pos_y += height; } } - drawfont = hud_font; if(weapons_with_stats) average_accuracy = floor(average_accuracy / weapons_with_stats); @@ -1033,7 +1071,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ hl_rgb_z = autocvar_scoreboard_color_bg_b + 0.5; pos_y += hud_fontsize_y; - drawstring(pos, strcat("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos, _("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += hud_fontsize_y; vector tmp; tmp_x = sbwidth; @@ -1124,16 +1162,13 @@ void HUD_DrawScoreboard() pos_z = 0; // Heading - drawfont = hud_bigfont; - drawstring(pos, "Scoreboard", '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(pos, _("Scoreboard"), '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); - centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth("Scoreboard", FALSE, '24 24 0')); + centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth(_("Scoreboard"), FALSE, '24 24 0')); centerprint_start_y = pos_y; pos_y += 24; - drawfont = hud_font; - // Draw the scoreboard vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale; @@ -1170,11 +1205,11 @@ void HUD_DrawScoreboard() if(gametype == GAME_CTS || gametype == GAME_RACE) { if(race_speedaward) { - drawcolorcodedstring(pos, strcat("Speed award: ", ftos(race_speedaward), " ^7(", race_speedaward_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos, sprintf(_("Speed award: %d ^7(%s^7)"), race_speedaward, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += 1.25 * hud_fontsize_y; } if(race_speedaward_alltimebest) { - drawcolorcodedstring(pos, strcat("All-time fastest: ", ftos(race_speedaward_alltimebest), " ^7(", race_speedaward_alltimebest_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += 1.25 * hud_fontsize_y; } pos = HUD_DrawScoreboardRankings(pos, pl, rgb, bg_size); @@ -1201,74 +1236,62 @@ void HUD_DrawScoreboard() if(specs) { - drawstring(tmp, "Spectators", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawstring(tmp, _("Spectators"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos_y += 1.25 * hud_fontsize_y; } // Print info string string str; float tl, fl, ll; - str = strcat("playing on ^2", shortmapname, "^7"); + str = sprintf(_("playing on ^2%s^7"), shortmapname); tl = getstatf(STAT_TIMELIMIT); fl = getstatf(STAT_FRAGLIMIT); ll = getstatf(STAT_LEADLIMIT); if(gametype == GAME_LMS) { if(tl > 0) - str = strcat(str, " for up to ^1", ftos(tl), " minutes^7"); + str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl)); } else { if(tl > 0) - str = strcat(str, " for ^1", ftos(tl), " minutes^7"); + str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl)); if(fl > 0) { if(tl > 0) - str = strcat(str, " or"); + str = strcat(str, _(" or")); if(teamplay) { - str = strcat(str, " until ^3", ScoreString(teamscores_flags[ts_primary], fl)); - if(teamscores_label[ts_primary] == "score") - str = strcat(str, " points^7"); - else if(teamscores_label[ts_primary] == "fastest") - str = strcat(str, " is beaten^7"); - else - str = strcat(str, " ", teamscores_label[ts_primary]); + 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, " until ^3", ScoreString(scores_flags[ps_primary], fl)); - if(scores_label[ps_primary] == "score") - str = strcat(str, " points^7"); - else if(scores_label[ps_primary] == "fastest") - str = strcat(str, " is beaten^7"); - else - str = strcat(str, " ", scores_label[ps_primary]); + 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]))); } } if(ll > 0) { if(tl > 0 || fl > 0) - str = strcat(str, " or"); + str = strcat(str, _(" or")); if(teamplay) { - str = strcat(str, " until a lead of ^3", ScoreString(teamscores_flags[ts_primary], ll)); - if(teamscores_label[ts_primary] == "score") - str = strcat(str, " points^7"); - else if(teamscores_label[ts_primary] == "fastest") - str = strcat(str, " is beaten^7"); - else - str = strcat(str, " ", teamscores_label[ts_primary]); + 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, " until a lead of ^3", ScoreString(scores_flags[ps_primary], ll)); - if(scores_label[ps_primary] == "score") - str = strcat(str, " points^7"); - else if(scores_label[ps_primary] == "fastest") - str = strcat(str, " is beaten^7"); - else - str = strcat(str, " ", scores_label[ps_primary]); + 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]))); } } }