// Scoreboard (#24)
+const int MAX_SBT_FIELDS = MAX_SCORE;
+
+PlayerScoreField sbt_field[MAX_SBT_FIELDS + 1];
+float sbt_field_size[MAX_SBT_FIELDS + 1];
+string sbt_field_title[MAX_SBT_FIELDS + 1];
+int sbt_num_fields;
+
string autocvar_hud_fontsize;
string hud_fontsize_str;
float max_namesize;
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;
+bool autocvar_hud_panel_scoreboard_maxheight = 0.5;
bool autocvar_hud_panel_scoreboard_others_showscore = true;
bool autocvar_hud_panel_scoreboard_spectators_showping = true;
{
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)
vector sbt_field_icon0_rgb;
vector sbt_field_icon1_rgb;
vector sbt_field_icon2_rgb;
-float sbt_field_icon0_alpha;
-float sbt_field_icon1_alpha;
-float sbt_field_icon2_alpha;
string Scoreboard_GetField(entity pl, PlayerScoreField field)
{
float tmp, num, denom;
sbt_field_icon0_rgb = '1 1 1';
sbt_field_icon1_rgb = '1 1 1';
sbt_field_icon2_rgb = '1 1 1';
- sbt_field_icon0_alpha = 1;
- sbt_field_icon1_alpha = 1;
- sbt_field_icon2_alpha = 1;
switch(field)
{
case SP_PING:
else if((sbt_highlight) && (!(pl_number % 2)))
drawfill(h_pos, h_size, rgb, sbt_highlight_alpha, DRAWFLAG_NORMAL);
+ float fg_alpha = (is_self ? sbt_fg_alpha_self : sbt_fg_alpha);
+
vector pos = item_pos;
pos.x += hud_fontsize.x * 0.5;
pos.y += (1.25 - 1) / 2 * hud_fontsize.y; // center text vertically
if(field == SP_NAME) {
tmp.x = sbt_field_size[i] - hud_fontsize.x * sbt_fixcolumnwidth_iconlen - sbt_fixcolumnwidth_marginlen + hud_fontsize.x;
- if (is_self)
- drawcolorcodedstring(pos - tmp, str, hud_fontsize, sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawcolorcodedstring(pos - tmp, str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawcolorcodedstring(pos - tmp, str, hud_fontsize, fg_alpha, DRAWFLAG_NORMAL);
} else {
tmp.x = sbt_fixcolumnwidth_len + hud_fontsize.x;
- if (is_self)
- drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, fg_alpha, DRAWFLAG_NORMAL);
}
tmp.x = sbt_field_size[i] + hud_fontsize.x;
if(sbt_field_icon0 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon0_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon0_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, fg_alpha, DRAWFLAG_NORMAL);
if(sbt_field_icon1 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon1_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon1_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, fg_alpha, DRAWFLAG_NORMAL);
if(sbt_field_icon2 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, sbt_field_icon2_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, sbt_field_icon2_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, fg_alpha, DRAWFLAG_NORMAL);
}
if(sbt_field[i] == SP_SEPARATOR)
if(field == SP_NAME) {
tmp.x = sbt_fixcolumnwidth_len; // left or right aligned? let's put it right...
- if(is_self)
- drawcolorcodedstring(pos - tmp, str, hud_fontsize, sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawcolorcodedstring(pos - tmp, str, hud_fontsize, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawcolorcodedstring(pos - tmp, str, hud_fontsize, fg_alpha, DRAWFLAG_NORMAL);
} else {
tmp.x = sbt_fixcolumnwidth_len;
- if(is_self)
- drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawstring(pos - tmp, str, hud_fontsize, sbt_field_rgb, fg_alpha, DRAWFLAG_NORMAL);
}
tmp.x = sbt_field_size[i];
if(sbt_field_icon0 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon0_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon0_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon0, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, fg_alpha, DRAWFLAG_NORMAL);
if(sbt_field_icon1 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon1_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, sbt_field_icon1_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon1, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon1_rgb, fg_alpha, DRAWFLAG_NORMAL);
if(sbt_field_icon2 != "")
- if (is_self)
- drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, sbt_field_icon2_alpha * sbt_fg_alpha_self, DRAWFLAG_NORMAL);
- else
- drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, sbt_field_icon2_alpha * sbt_fg_alpha, DRAWFLAG_NORMAL);
+ drawpic(pos - tmp, sbt_field_icon2, eY * hud_fontsize.y + eX * hud_fontsize.x * sbt_fixcolumnwidth_iconlen, sbt_field_icon2_rgb, fg_alpha, DRAWFLAG_NORMAL);
pos.x -= sbt_field_size[i] + hud_fontsize.x;
}
}
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.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