bool autocvar_hud_panel_scoreboard_dynamichud = false;
-bool autocvar_hud_panel_scoreboard_maxrows = true;
-int autocvar_hud_panel_scoreboard_maxrows_players = 20;
-int autocvar_hud_panel_scoreboard_maxrows_teamplayers = 9;
+float autocvar_hud_panel_scoreboard_maxheight = 0.5;
bool autocvar_hud_panel_scoreboard_others_showscore = true;
bool autocvar_hud_panel_scoreboard_spectators_showping = true;
+float autocvar_hud_panel_scoreboard_minwidth = 0.4;
void drawstringright(vector, string, vector, vector, float, float);
{
float Team;
entity pl, tmp;
- float num;
-
- num = 0;
+ //int num = 0;
for(pl = players.sort_next; pl; pl = pl.sort_next)
{
- num += 1;
+ //num += 1;
Team = entcs_GetScoreTeam(pl.sv_entnum);
if(SetTeam(pl, Team))
{
TC(int, argc);
int i, slash;
string str, pattern;
- float have_name = 0, have_primary = 0, have_secondary = 0, have_separator = 0;
- float missing;
+ bool have_name = false, have_primary = false, have_secondary = false, have_separator = false;
+ int missing;
if(!gametype)
return; // do nothing, we don't know gametype and scores yet
LABEL(found)
sbt_field[sbt_num_fields] = j;
if(j == ps_primary)
- have_primary = 1;
+ have_primary = true;
if(j == ps_secondary)
- have_secondary = 1;
+ have_secondary = true;
}
}
}
if(scores_flags(ps_primary) & SFL_ALLOW_HIDE)
- have_primary = 1;
+ have_primary = true;
if(scores_flags(ps_secondary) & SFL_ALLOW_HIDE)
- have_secondary = 1;
+ have_secondary = true;
if(ps_primary == ps_secondary)
- have_secondary = 1;
+ have_secondary = true;
missing = (!have_primary) + (!have_secondary) + (!have_separator) + (!have_name);
if(sbt_num_fields + missing < MAX_SBT_FIELDS)
void Scoreboard_initFieldSizes()
{
for(int i = 0; i < sbt_num_fields; ++i)
+ {
+ sbt_field_size[i] = stringwidth(sbt_field_title[i], false, hud_fontsize);
Scoreboard_FixColumnWidth(i, "");
+ }
}
vector Scoreboard_DrawHeader(vector pos, vector rgb, bool other_players)
vector Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_size)
{
int max_players = 999;
- if(autocvar_hud_panel_scoreboard_maxrows)
+ if(autocvar_hud_panel_scoreboard_maxheight > 0)
{
+ max_players = autocvar_hud_panel_scoreboard_maxheight * vid_conheight;
if(teamplay)
- max_players = autocvar_hud_panel_scoreboard_maxrows_teamplayers;
- else
- max_players = autocvar_hud_panel_scoreboard_maxrows_players;
+ max_players = (max_players - hud_fontsize.y * 1.25 - panel_bg_padding * 2) / 2;
+ max_players = floor(max_players / (hud_fontsize.y * 1.25));
if(max_players <= 1)
max_players = 1;
if(max_players == tm.team_size)
return end_pos;
}
-float Scoreboard_WouldDraw() {
+bool Scoreboard_WouldDraw()
+{
if (QuickMenu_IsOpened())
- return 0;
+ return false;
else if (HUD_Radar_Clickable())
- return 0;
+ return false;
else if (scoreboard_showscores)
- return 1;
+ return true;
else if (intermission == 1)
- return 1;
+ return true;
else if (intermission == 2)
- return 0;
+ return false;
else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS && !active_minigame)
- return 1;
+ return true;
else if (scoreboard_showscores_force)
- return 1;
- return 0;
+ return true;
+ return false;
}
float average_accuracy;
pos.y += panel_bg_border;
panel_pos = pos;
- panel_size.y = 1.25 * hud_fontsize.y * RANKINGS_RECEIVED_CNT;
+
+ float namesize = 0;
+ for(i = 0; i < RANKINGS_RECEIVED_CNT; ++i)
+ {
+ float f = stringwidth(grecordholder[i], true, hud_fontsize);
+ if(f > namesize)
+ namesize = f;
+ }
+ bool cut = false;
+ if(namesize > autocvar_hud_panel_scoreboard_namesize * hud_fontsize.x)
+ {
+ namesize = autocvar_hud_panel_scoreboard_namesize * hud_fontsize.x;
+ cut = true;
+ }
+
+ float ranksize = 3 * hud_fontsize.x;
+ float timesize = 5 * hud_fontsize.x;
+ vector columnsize = eX * (ranksize + timesize + namesize + hud_fontsize.x) + eY * 1.25 * hud_fontsize.y;
+ int columns = max(1, floor((panel_size.x - 2 * panel_bg_padding) / columnsize.x));
+ columns = min(columns, RANKINGS_RECEIVED_CNT);
+
+ // expand name column to fill the entire row
+ float available_space = (panel_size.x - 2 * panel_bg_padding - columnsize.x * columns) / columns;
+ namesize += available_space;
+ columnsize.x += available_space;
+
+ panel_size.y = ceil(RANKINGS_RECEIVED_CNT / columns) * 1.25 * hud_fontsize.y;
panel_size.y += panel_bg_padding * 2;
+
HUD_Panel_DrawBg();
vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
}
pos = panel_pos;
- vector tmp = panel_size;
if (sbt_bg_alpha)
- drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, sbt_bg_alpha, DRAWFLAG_NORMAL);
+ drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, panel_size, rgb, sbt_bg_alpha, DRAWFLAG_NORMAL);
- // row highlighting
+ vector text_ofs = eX * 0.5 * hud_fontsize.x + eY * (1.25 - 1) / 2 * hud_fontsize.y; // center text vertically
+ string str = "";
+ int column = 0, j = 0;
for(i = 0; i < RANKINGS_RECEIVED_CNT; ++i)
{
- string n, p;
float t;
t = grecordtime[i];
if (t == 0)
continue;
- n = grecordholder[i];
- p = count_ordinal(i+1);
+
if(grecordholder[i] == entcs_GetName(player_localnum))
- drawfill(pos, eX * panel_size.x + '0 1.25 0' * hud_fontsize.y, hl_rgb, sbt_highlight_alpha_self, DRAWFLAG_NORMAL);
- else if(!(i % 2) && sbt_highlight)
- drawfill(pos, eX * panel_size.x + '0 1.25 0' * hud_fontsize.y, hl_rgb, sbt_highlight_alpha, DRAWFLAG_NORMAL);
- drawstring(pos, p, '1 1 0' * hud_fontsize.y, '1 1 1', sbt_fg_alpha, DRAWFLAG_NORMAL);
- drawstring(pos + '3 0 0' * hud_fontsize.y, TIME_ENCODED_TOSTRING(t), '1 1 0' * hud_fontsize.y, '1 1 1', sbt_fg_alpha, DRAWFLAG_NORMAL);
- drawcolorcodedstring(pos + '8 0 0' * hud_fontsize.y, n, '1 1 0' * hud_fontsize.y, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawfill(pos, columnsize, hl_rgb, sbt_highlight_alpha_self, DRAWFLAG_NORMAL);
+ else if(!((j + column) & 1) && sbt_highlight)
+ drawfill(pos, columnsize, hl_rgb, sbt_highlight_alpha, DRAWFLAG_NORMAL);
+
+ str = count_ordinal(i+1);
+ drawstring(pos + text_ofs, str, hud_fontsize, '1 1 1', sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos + text_ofs + eX * ranksize, TIME_ENCODED_TOSTRING(t), hud_fontsize, '1 1 1', sbt_fg_alpha, DRAWFLAG_NORMAL);
+ str = grecordholder[i];
+ if(cut)
+ str = textShortenToWidth(str, namesize, hud_fontsize, stringwidth_colors);
+ drawcolorcodedstring(pos + text_ofs + eX * (ranksize + timesize), str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
+
pos.y += 1.25 * hud_fontsize.y;
+ j++;
+ if(j >= ceil(RANKINGS_RECEIVED_CNT / columns))
+ {
+ column++;
+ j = 0;
+ pos.x += panel_size.x / columns;
+ pos.y = panel_pos.y;
+ }
}
panel_size.x += panel_bg_padding * 2; // restore initial width
panel_pos.y = max((autocvar_con_notify * autocvar_con_notifysize), panel_pos.y);
float excess = max(0, max_namesize - autocvar_hud_panel_scoreboard_namesize * hud_fontsize.x);
- float fixed_scoreboard_width = bound(vid_conwidth * 0.4, vid_conwidth - excess, vid_conwidth * 0.93);
+ float fixed_scoreboard_width = bound(vid_conwidth * autocvar_hud_panel_scoreboard_minwidth, vid_conwidth - excess, vid_conwidth * 0.93);
panel_pos.x = 0.5 * (vid_conwidth - fixed_scoreboard_width);
panel_size.x = fixed_scoreboard_width;
{
if(pl.team == NUM_SPECTATOR)
{
+ for(tm = teams.sort_next; tm; tm = tm.sort_next)
+ if(tm.team == NUM_SPECTATOR)
+ break;
+ str = sprintf("%s (%d)", _("Spectators"), tm.team_size);
draw_beginBoldFont();
- drawstring(pos, _("Spectators"), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos, str, hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
draw_endBoldFont();
pos.y += 1.25 * hud_fontsize.y;