]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/hud/panel/scoreboard.qc
Show the correct key to join a team in the team selection interface; it fixes #2836
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / hud / panel / scoreboard.qc
index 83700a7e5efe52ece3d5b7cedf510172e0972ffc..2f6bc474c5f1d1dcd7080f6cca455450877cd02f 100644 (file)
@@ -106,9 +106,16 @@ float autocvar_hud_panel_scoreboard_minwidth = 0.4;
 bool autocvar_hud_panel_scoreboard_playerid = false;
 string autocvar_hud_panel_scoreboard_playerid_prefix = "#";
 string autocvar_hud_panel_scoreboard_playerid_suffix = " ";
+bool autocvar_hud_panel_scoreboard_scores_per_round;
 
 float scoreboard_time;
 
+SHUTDOWN(scoreboard)
+{
+       if(autocvar_hud_panel_scoreboard_scores_per_round)
+               cvar_set("hud_panel_scoreboard_scores_per_round", "0");
+}
+
 // mode 0: returns translated label
 // mode 1: prints name and description of all the labels
 string Label_getInfo(string label, int mode)
@@ -153,6 +160,7 @@ string Label_getInfo(string label, int mode)
                case "returns":      if (!mode) return CTX(_("SCO^returns"));      else LOG_HELP(strcat("^3", "returns", "            ^7", _("Number of flag returns")));
                case "revivals":     if (!mode) return CTX(_("SCO^revivals"));     else LOG_HELP(strcat("^3", "revivals", "           ^7", _("Number of revivals")));
                case "rounds":       if (!mode) return CTX(_("SCO^rounds won"));   else LOG_HELP(strcat("^3", "rounds", "             ^7", _("Number of rounds won")));
+               case "rounds_pl":    if (!mode) return CTX(_("SCO^rounds played"));else LOG_HELP(strcat("^3", "rounds_pl", "          ^7", _("Number of rounds played")));
                case "score":        if (!mode) return CTX(_("SCO^score"));        else LOG_HELP(strcat("^3", "score", "              ^7", _("Total score")));
                case "suicides":     if (!mode) return CTX(_("SCO^suicides"));     else LOG_HELP(strcat("^3", "suicides", "           ^7", _("Number of suicides")));
                case "sum":          if (!mode) return CTX(_("SCO^sum"));          else LOG_HELP(strcat("^3", "sum", "                ^7", _("Number of kills minus deaths")));
@@ -169,7 +177,7 @@ bool scoreboard_ui_disabling;
 void HUD_Scoreboard_UI_Disable()
 {
        scoreboard_ui_disabling = true;
-       scoreboard_showscores = false;
+       sb_showscores = false;
 }
 
 void HUD_Scoreboard_UI_Disable_Instantly()
@@ -184,6 +192,8 @@ void HUD_Scoreboard_UI_Disable_Instantly()
 // mode: 0 normal, 1 team selection
 void Scoreboard_UI_Enable(int mode)
 {
+       if(isdemo()) return;
+
        if (mode == 1)
        {
                if (scoreboard_ui_enabled == 2 || !teamplay || intermission)
@@ -465,6 +475,13 @@ float HUD_Scoreboard_InputEvent(float bInputType, float nPrimary, float nSeconda
                        }
                }
        }
+       else if(nPrimary == 'r' && (hudShiftState & S_CTRL))
+       {
+               if (!key_pressed)
+                       return true;
+               if (scoreboard_selected_panel == SB_PANEL_SCOREBOARD)
+                       localcmd("toggle hud_panel_scoreboard_scores_per_round\n");
+       }
        else if(nPrimary == 't' && (hudShiftState & S_CTRL))
        {
                if (!key_pressed)
@@ -497,8 +514,6 @@ float HUD_Scoreboard_InputEvent(float bInputType, float nPrimary, float nSeconda
 void PrintScoresLabels() { Label_getInfo(string_null, 1); }
 string TranslateScoresLabel(string label) { return Label_getInfo(label, 0); }
 
-#define SB_EXTRA_SORTING_FIELDS 5
-PlayerScoreField sb_extra_sorting_field[SB_EXTRA_SORTING_FIELDS];
 void Scoreboard_InitScores()
 {
        int i, f;
@@ -506,18 +521,13 @@ void Scoreboard_InitScores()
        ps_primary = ps_secondary = NULL;
        ts_primary = ts_secondary = -1;
        FOREACH(Scores, true, {
+               if(scores_flags(it) & SFL_NOT_SORTABLE)
+                       continue;
                f = (scores_flags(it) & SFL_SORT_PRIO_MASK);
                if(f == SFL_SORT_PRIO_PRIMARY)
                        ps_primary = it;
                if(f == SFL_SORT_PRIO_SECONDARY)
                        ps_secondary = it;
-               if(ps_primary == it || ps_secondary == it)
-                       continue;
-               if (scores_label(it) == "kills")      sb_extra_sorting_field[0] = it;
-               if (scores_label(it) == "deaths")     sb_extra_sorting_field[1] = it;
-               if (scores_label(it) == "suicides")   sb_extra_sorting_field[2] = it;
-               if (scores_label(it) == "dmg")        sb_extra_sorting_field[3] = it;
-               if (scores_label(it) == "dmgtaken")   sb_extra_sorting_field[4] = it;
        });
        if(ps_secondary == NULL)
                ps_secondary = ps_primary;
@@ -545,9 +555,11 @@ void Scoreboard_UpdatePlayerTeams()
        update_time = time;
 
        entity pl, tmp;
+       numplayers = 0;
        //int num = 0;
        for(pl = players.sort_next; pl; pl = pl.sort_next)
        {
+               numplayers += pl.team != NUM_SPECTATOR;
                //num += 1;
                int Team = entcs_GetScoreTeam(pl.sv_entnum);
                if(SetTeam(pl, Team))
@@ -603,27 +615,20 @@ float Scoreboard_ComparePlayerScores(entity left, entity right)
                return false;
        }
 
-       entity fld = NULL;
-       int r;
-       for (int i = -2; i < SB_EXTRA_SORTING_FIELDS; ++i)
-       {
-               if (i < 0)
-               {
-                       if (!fld) fld = ps_primary;
-                       else if (ps_secondary == ps_primary) continue;
-                       else fld = ps_secondary;
-               }
-               else
-               {
-                       fld = sb_extra_sorting_field[i];
-                       if (fld == ps_primary || fld == ps_secondary) continue;
-               }
-               if (!fld) continue;
+       int res = Scoreboard_CompareScore(left.scores(ps_primary), right.scores(ps_primary), scores_flags(ps_primary));
+       if (res >= 0) return res;
 
-               r = Scoreboard_CompareScore(left.scores(fld), right.scores(fld), scores_flags(fld));
-               if (r >= 0) return r;
+       if (ps_secondary && ps_secondary != ps_primary)
+       {
+               res = Scoreboard_CompareScore(left.scores(ps_secondary), right.scores(ps_secondary), scores_flags(ps_secondary));
+               if (res >= 0) return res;
        }
 
+       FOREACH(Scores, (it != ps_primary && it != ps_secondary), {
+               res = Scoreboard_CompareScore(left.scores(it), right.scores(it), scores_flags(it));
+               if (res >= 0) return res;
+       });
+
        if (left.sv_entnum < right.sv_entnum)
                return true;
 
@@ -977,7 +982,23 @@ string Scoreboard_GetName(entity pl)
        return entcs_GetName(pl.sv_entnum);
 }
 
-string Scoreboard_GetField(entity pl, PlayerScoreField field)
+int autocvar_hud_panel_scoreboard_ping_best = 0;
+int autocvar_hud_panel_scoreboard_ping_medium = 70;
+int autocvar_hud_panel_scoreboard_ping_high = 100;
+int autocvar_hud_panel_scoreboard_ping_worst = 150;
+vector autocvar_hud_panel_scoreboard_ping_best_color = '0 1 0';
+vector autocvar_hud_panel_scoreboard_ping_medium_color = '1 1 0';
+vector autocvar_hud_panel_scoreboard_ping_high_color = '1 0.5 0';
+vector autocvar_hud_panel_scoreboard_ping_worst_color = '1 0 0';
+#define PING_BEST autocvar_hud_panel_scoreboard_ping_best
+#define PING_MED autocvar_hud_panel_scoreboard_ping_medium
+#define PING_HIGH autocvar_hud_panel_scoreboard_ping_high
+#define PING_WORST autocvar_hud_panel_scoreboard_ping_worst
+#define COLOR_BEST autocvar_hud_panel_scoreboard_ping_best_color
+#define COLOR_MED autocvar_hud_panel_scoreboard_ping_medium_color
+#define COLOR_HIGH autocvar_hud_panel_scoreboard_ping_high_color
+#define COLOR_WORST autocvar_hud_panel_scoreboard_ping_worst_color
+string Scoreboard_GetField(entity pl, PlayerScoreField field, bool per_round)
 {
        float tmp, num, denom;
        int f;
@@ -989,6 +1010,9 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
        sbt_field_icon0_rgb = '1 1 1';
        sbt_field_icon1_rgb = '1 1 1';
        sbt_field_icon2_rgb = '1 1 1';
+       int rounds_played = 0;
+       if (per_round)
+               rounds_played = pl.(scores(SP_ROUNDS_PL));
        switch(field)
        {
                case SP_PING:
@@ -998,8 +1022,16 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                        f = pl.ping;
                        if(f == 0)
                                return _("N/A");
-                       tmp = max(0, min(220, f-80)) / 220;
-                       sbt_field_rgb = '1 1 1' - '0 1 1' * tmp;
+                       if(f < PING_BEST)
+                               sbt_field_rgb = COLOR_BEST;
+                       else if(f < PING_MED)
+                               sbt_field_rgb = COLOR_BEST + (COLOR_MED - COLOR_BEST) * ((f - PING_BEST) / (PING_MED - PING_BEST));
+                       else if(f < PING_HIGH)
+                               sbt_field_rgb = COLOR_MED + (COLOR_HIGH - COLOR_MED) * ((f - PING_MED) / (PING_HIGH - PING_MED));
+                       else if(f < PING_WORST)
+                               sbt_field_rgb = COLOR_HIGH + (COLOR_WORST - COLOR_HIGH) * ((f - PING_HIGH) / (PING_WORST - PING_HIGH));
+                       else
+                               sbt_field_rgb = COLOR_WORST;
                        return ftos(f);
 
                case SP_PL:
@@ -1025,6 +1057,8 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                case SP_FRAGS:
                        f = pl.(scores(SP_KILLS));
                        f -= pl.(scores(SP_SUICIDES));
+                       if (rounds_played)
+                               return sprintf("%.1f", f / rounds_played);
                        return ftos(f);
 
                case SP_KDRATIO:
@@ -1033,12 +1067,23 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
 
                        if(denom == 0) {
                                sbt_field_rgb = '0 1 0';
-                               str = sprintf("%d", num);
+                               if (rounds_played)
+                                       str = sprintf("%.1f", num / rounds_played);
+                               else
+                                       str = sprintf("%d", num);
                        } else if(num <= 0) {
                                sbt_field_rgb = '1 0 0';
-                               str = sprintf("%.1f", num/denom);
+                               if (rounds_played)
+                                       str = sprintf("%.2f", num / (denom * rounds_played));
+                               else
+                                       str = sprintf("%.1f", num / denom);
                        } else
-                               str = sprintf("%.1f", num/denom);
+                       {
+                               if (rounds_played)
+                                       str = sprintf("%.2f", num / (denom * rounds_played));
+                               else
+                                       str = sprintf("%.1f", num / denom);
+                       }
                        return str;
 
                case SP_SUM:
@@ -1052,6 +1097,8 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                        } else {
                                sbt_field_rgb = '1 0 0';
                        }
+                       if (rounds_played)
+                               return sprintf("%.1f", f / rounds_played);
                        return ftos(f);
 
                case SP_ELO:
@@ -1077,7 +1124,12 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                        return ftos(fps);
                }
 
+               case SP_ROUNDS_PL:
+                       return ftos(pl.(scores(field)));
+
                case SP_DMG: case SP_DMGTAKEN:
+                       if (rounds_played)
+                               return sprintf("%.2f k", pl.(scores(field)) / (1000 * rounds_played));
                        return sprintf("%.1f k", pl.(scores(field)) / 1000);
 
                default: case SP_SCORE:
@@ -1089,7 +1141,7 @@ string Scoreboard_GetField(entity pl, PlayerScoreField field)
                                sbt_field_rgb = '0 1 1';
                        else
                                sbt_field_rgb = '1 1 1';
-                       return ScoreString(f, tmp);
+                       return ScoreString(f, tmp, rounds_played);
        }
        //return "error";
 }
@@ -1263,7 +1315,7 @@ void Scoreboard_DrawItem(vector item_pos, vector rgb, entity pl, bool is_self, i
                        pos.x += sbt_field_size[i] + hud_fontsize.x;
                        continue;
                }
-               str = Scoreboard_GetField(pl, field);
+               str = Scoreboard_GetField(pl, field, autocvar_hud_panel_scoreboard_scores_per_round);
                str = Scoreboard_FixColumnWidth(i, str);
 
                pos.x += sbt_field_size[i] + hud_fontsize.x;
@@ -1299,7 +1351,7 @@ void Scoreboard_DrawItem(vector item_pos, vector rgb, entity pl, bool is_self, i
                                continue;
                        }
 
-                       str = Scoreboard_GetField(pl, field);
+                       str = Scoreboard_GetField(pl, field, autocvar_hud_panel_scoreboard_scores_per_round);
                        str = Scoreboard_FixColumnWidth(i, str);
 
                        if(field == SP_NAME) {
@@ -1368,10 +1420,10 @@ vector Scoreboard_DrawOthers(vector item_pos, vector rgb, int this_team, entity
                if(this_team == NUM_SPECTATOR)
                {
                        if(autocvar_hud_panel_scoreboard_spectators_showping)
-                               field = Scoreboard_GetField(pl, SP_PING);
+                               field = Scoreboard_GetField(pl, SP_PING, autocvar_hud_panel_scoreboard_scores_per_round);
                }
                else if(autocvar_hud_panel_scoreboard_others_showscore)
-                       field = Scoreboard_GetField(pl, SP_SCORE);
+                       field = Scoreboard_GetField(pl, SP_SCORE, autocvar_hud_panel_scoreboard_scores_per_round);
 
                string str = entcs_GetName(pl.sv_entnum);
                if (autocvar_hud_panel_scoreboard_playerid)
@@ -1574,7 +1626,7 @@ bool Scoreboard_WouldDraw()
                return false;
        else if (HUD_Radar_Clickable())
                return false;
-       else if (scoreboard_showscores)
+       else if (sb_showscores) // set by +showscores engine command
                return true;
        else if (intermission == 1)
                return true;
@@ -2162,6 +2214,15 @@ vector Scoreboard_Spectators_Draw(vector pos) {
        return pos;
 }
 
+string Scoreboard_Fraglimit_Draw(float limit, bool is_leadlimit)
+{
+       string s_label = (teamplay) ? teamscores_label(ts_primary) : scores_label(ps_primary);
+       int s_flags = (teamplay) ? teamscores_flags(ts_primary) : scores_flags(ps_primary);
+       return sprintf((is_leadlimit ? _("^2+%s %s") : _("^5%s %s")), ScoreString(s_flags, limit, 0),
+               (s_label == "score") ? CTX(_("SCO^points")) :
+               (s_label == "fastest") ? "" : TranslateScoresLabel(s_label));
+}
+
 void Scoreboard_Draw()
 {
        if(!autocvar__hud_configure)
@@ -2261,9 +2322,9 @@ void Scoreboard_Draw()
        if (scoreboard_ui_enabled == 2)
        {
                if (scoreboard_selected_team)
-                       str = sprintf(_("^7Press ^3%s^7 to join the selected team"), getcommandkey(_("jump"), "+jump"));
+                       str = sprintf(_("^7Press ^3%s^7 to join the selected team"), translate_key("SPACE"));
                else
-                       str = sprintf(_("^7Press ^3%s^7 to auto-select a team and join"), getcommandkey(_("jump"), "+jump"));
+                       str = sprintf(_("^7Press ^3%s^7 to auto-select a team and join"), translate_key("SPACE"));
                drawcolorcodedstring(pos + '0.5 0 0' * (panel_size.x - stringwidth(str, true, sb_gameinfo_detail_fontsize)), str, sb_gameinfo_detail_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
 
                pos.y += sb_gameinfo_detail_fontsize.y + hud_fontsize.y * 0.3;
@@ -2285,20 +2346,7 @@ void Scoreboard_Draw()
                        {
                                if(tl > 0)
                                        str = strcat(str, "^7 / "); // delimiter
-                               if(teamplay)
-                               {
-                                       str = strcat(str, sprintf(_("^5%s %s"), ScoreString(teamscores_flags(ts_primary), fl),
-                                               (teamscores_label(ts_primary) == "score")   ? CTX(_("SCO^points")) :
-                                               (teamscores_label(ts_primary) == "fastest") ? "" :
-                                               TranslateScoresLabel(teamscores_label(ts_primary))));
-                               }
-                               else
-                               {
-                                       str = strcat(str, sprintf(_("^5%s %s"), ScoreString(scores_flags(ps_primary), fl),
-                                               (scores_label(ps_primary) == "score")   ? CTX(_("SCO^points")) :
-                                               (scores_label(ps_primary) == "fastest") ? "" :
-                                               TranslateScoresLabel(scores_label(ps_primary))));
-                               }
+                               str = strcat(str, Scoreboard_Fraglimit_Draw(fl, false));
                        }
                        if(ll > 0)
                        {
@@ -2310,26 +2358,16 @@ void Scoreboard_Draw()
                                        else
                                                str = strcat(str, "^7 / ");
                                }
-
-                               if(teamplay)
-                               {
-                                       str = strcat(str, sprintf(_("^2+%s %s"), ScoreString(teamscores_flags(ts_primary), ll),
-                                               (teamscores_label(ts_primary) == "score")   ? CTX(_("SCO^points")) :
-                                               (teamscores_label(ts_primary) == "fastest") ? "" :
-                                               TranslateScoresLabel(teamscores_label(ts_primary))));
-                               }
-                               else
-                               {
-                                       str = strcat(str, sprintf(_("^2+%s %s"), ScoreString(scores_flags(ps_primary), ll),
-                                               (scores_label(ps_primary) == "score")   ? CTX(_("SCO^points")) :
-                                               (scores_label(ps_primary) == "fastest") ? "" :
-                                               TranslateScoresLabel(scores_label(ps_primary))));
-                               }
+                               str = strcat(str, Scoreboard_Fraglimit_Draw(ll, true));
                        }
                }
                drawcolorcodedstring(pos + '1 0 0' * (panel_size.x - stringwidth(str, true, sb_gameinfo_detail_fontsize)), str, sb_gameinfo_detail_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); // align right
-               // map name
-               str = sprintf(_("^7Map: ^2%s"), shortmapname);
+               // map name and player count
+               if (campaign)
+                       str = "";
+               else
+                       str = sprintf(_("^5%d^7/^5%d ^7players"), numplayers, srv_maxplayers ? srv_maxplayers : maxclients);
+               str = strcat("^7", _("Map:"), " ^2", mi_shortname, "    ", str); // reusing "Map:" translatable string
                drawcolorcodedstring(pos, str, sb_gameinfo_detail_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); // align left
        }
        // End of Game Info Section
@@ -2482,7 +2520,8 @@ void Scoreboard_Draw()
 
        if(MUTATOR_CALLHOOK(ShowRankings)) {
                string ranktitle = M_ARGV(0, string);
-               string unit = GetSpeedUnit(autocvar_hud_panel_physics_speed_unit);
+               string unit = GetSpeedUnit(autocvar_hud_speed_unit);
+               float conversion_factor = GetSpeedUnitFactor(autocvar_hud_speed_unit);
                if(race_speedaward_alltimebest)
                {
                        string name;
@@ -2491,11 +2530,11 @@ void Scoreboard_Draw()
                        if(race_speedaward)
                        {
                                name = textShortenToWidth(ColorTranslateRGB(race_speedaward_holder), namesize, hud_fontsize, stringwidth_colors);
-                               str = sprintf(_("Speed award: %d%s ^7(%s^7)"), race_speedaward, unit, name);
+                               str = sprintf(_("Speed award: %d%s ^7(%s^7)"), race_speedaward * conversion_factor, unit, name);
                                str = strcat(str, " / ");
                        }
                        name = textShortenToWidth(ColorTranslateRGB(race_speedaward_alltimebest_holder), namesize, hud_fontsize, stringwidth_colors);
-                       str = strcat(str, sprintf(_("All-time fastest: %d%s ^7(%s^7)"), race_speedaward_alltimebest, unit, name));
+                       str = strcat(str, sprintf(_("All-time fastest: %d%s ^7(%s^7)"), race_speedaward_alltimebest * conversion_factor, unit, name));
                        drawcolorcodedstring(pos, str, hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
                        pos.y += 1.25 * hud_fontsize.y; // line height + line spacing
                }