#include <common/stats.qh>
#include <common/teams.qh>
+// Scoreboard (#24)
+
float sbt_bg_alpha;
float sbt_fg_alpha;
float sbt_fg_alpha_self;
float sbt_highlight_alpha;
float sbt_highlight_alpha_self;
+// provide basic panel cvars to old clients
+// TODO remove them after a future release (0.8.2+)
+string autocvar_hud_panel_scoreboard_pos = "0.150000 0.150000";
+string autocvar_hud_panel_scoreboard_size = "0.700000 0.700000";
+string autocvar_hud_panel_scoreboard_bg = "border_default";
+string autocvar_hud_panel_scoreboard_bg_color = "0 0.3 0.5";
+string autocvar_hud_panel_scoreboard_bg_color_team = "";
+string autocvar_hud_panel_scoreboard_bg_alpha = "0.7";
+string autocvar_hud_panel_scoreboard_bg_border = "";
+string autocvar_hud_panel_scoreboard_bg_padding = "";
+
float autocvar_hud_panel_scoreboard_fadeinspeed = 10;
float autocvar_hud_panel_scoreboard_fadeoutspeed = 5;
float autocvar_hud_panel_scoreboard_respawntime_decimals = 1;
-float autocvar_hud_panel_scoreboard_table_bg_alpha = 0.7;
+float autocvar_hud_panel_scoreboard_table_bg_alpha = 0;
float autocvar_hud_panel_scoreboard_table_bg_scale = 0.25;
float autocvar_hud_panel_scoreboard_table_fg_alpha = 0.9;
float autocvar_hud_panel_scoreboard_table_fg_alpha_self = 1;
case "rank": return CTX(_("SCO^rank"));
case "returns": return CTX(_("SCO^returns"));
case "revivals": return CTX(_("SCO^revivals"));
+ case "rounds": return CTX(_("SCO^rounds won"));
case "score": return CTX(_("SCO^score"));
case "suicides": return CTX(_("SCO^suicides"));
case "takes": return CTX(_("SCO^takes"));
// no layout can be properly set up until score_info data haven't been received
argc = tokenizebyseparator("0 1 ping pl name | score", " ");
ps_primary = SP_SCORE;
+ ps_secondary = SP_SCORE;
scores_label(ps_primary) = strzone("score");
scores_flags(ps_primary) = SFL_ALLOW_HIDE;
}
panel_pos = pos;
panel_size.y = 1.25 * hud_fontsize.y * (1 + max(1, tm.team_size));
panel_size.y += panel_bg_padding * 2;
- HUD_Panel_DrawBg(scoreboard_fade_alpha);
+ HUD_Panel_DrawBg();
- vector end_pos = panel_pos + eY * (panel_size.y + panel_bg_border * 2 + hud_fontsize.y);
+ vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
+ if(panel.current_panel_bg != "0")
+ end_pos.y += panel_bg_border * 2;
if(panel_bg_padding)
{
drawstring(pos + eX * panel_bg_padding, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
pos.y += 1.25 * hud_fontsize.y;
- pos.y += panel_bg_border;
+ if(panel.current_panel_bg != "0")
+ pos.y += panel_bg_border;
panel_pos = pos;
panel_size.y = height * rows;
panel_size.y += panel_bg_padding * 2;
- HUD_Panel_DrawBg(scoreboard_fade_alpha);
+ HUD_Panel_DrawBg();
- vector end_pos = panel_pos + eY * (panel_size.y + panel_bg_border * 2 + hud_fontsize.y);
+ vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
+ if(panel.current_panel_bg != "0")
+ end_pos.y += panel_bg_border * 2;
if(panel_bg_padding)
{
// get monster stats
stat_monsters_killed = STAT(MONSTERS_KILLED);
stat_monsters_total = STAT(MONSTERS_TOTAL);
- stat_monsters_killed = 14;
- stat_monsters_total = 22;
// get secrets stats
stat_secrets_found = STAT(SECRETS_FOUND);
stat_secrets_total = STAT(SECRETS_TOTAL);
- stat_secrets_found = 5;
- stat_secrets_total = 7;
// get number of rows
if(stat_secrets_total)
// draw table header
drawstring(pos + eX * panel_bg_padding, _("Map stats:"), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
pos.y += 1.25 * hud_fontsize.y;
- pos.y += panel_bg_border;
+ if(panel.current_panel_bg != "0")
+ pos.y += panel_bg_border;
panel_pos = pos;
panel_size.y = hud_fontsize.y * rows;
panel_size.y += panel_bg_padding * 2;
- HUD_Panel_DrawBg(scoreboard_fade_alpha);
+ HUD_Panel_DrawBg();
- vector end_pos = panel_pos + eY * (panel_size.y + panel_bg_border * 2 + hud_fontsize.y);
+ vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
+ if(panel.current_panel_bg != "0")
+ end_pos.y += panel_bg_border * 2;
if(panel_bg_padding)
{
pos.y += hud_fontsize.y;
drawstring(pos + eX * panel_bg_padding, _("Rankings"), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
pos.y += 1.25 * hud_fontsize.y;
- pos.y += panel_bg_border;
+ if(panel.current_panel_bg != "0")
+ pos.y += panel_bg_border;
panel_pos = pos;
panel_size.y = 1.25 * hud_fontsize.y * RANKINGS_RECEIVED_CNT;
panel_size.y += panel_bg_padding * 2;
- HUD_Panel_DrawBg(scoreboard_fade_alpha);
+ HUD_Panel_DrawBg();
- vector end_pos = panel_pos + eY * (panel_size.y + panel_bg_border * 2 + hud_fontsize.y);
+ vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y);
+ if(panel.current_panel_bg != "0")
+ end_pos.y += panel_bg_border * 2;
if(panel_bg_padding)
{
{
if(!autocvar__hud_configure)
{
+ if(!hud_draw_maximized) return;
+
// frametime checks allow to toggle the scoreboard even when the game is paused
if(scoreboard_active) {
- if(menu_enabled == 1)
+ if(hud_configure_menu_open == 1)
scoreboard_fade_alpha = 1;
float scoreboard_fadeinspeed = autocvar_hud_panel_scoreboard_fadeinspeed;
if (scoreboard_fadeinspeed && frametime)
else
HUD_Scale_Disable();
- float hud_fade_alpha_save = hud_fade_alpha;
- if(menu_enabled == 1)
- hud_fade_alpha = 1;
- else
- hud_fade_alpha = scoreboard_fade_alpha * (1 - autocvar__menu_alpha);
- HUD_Panel_UpdateCvars();
+ if(scoreboard_fade_alpha <= 0)
+ return;
+ panel_fade_alpha *= scoreboard_fade_alpha;
+ HUD_Panel_LoadCvars();
sbt_bg_alpha = autocvar_hud_panel_scoreboard_table_bg_alpha * panel_fg_alpha;
sbt_highlight = autocvar_hud_panel_scoreboard_table_highlight;
sbt_fg_alpha = autocvar_hud_panel_scoreboard_table_fg_alpha * panel_fg_alpha;
sbt_fg_alpha_self = autocvar_hud_panel_scoreboard_table_fg_alpha_self * panel_fg_alpha;
- hud_fade_alpha = hud_fade_alpha_save;
-
// don't overlap with con_notify
if(!autocvar__hud_configure)
panel_pos.y = max((autocvar_con_notify * autocvar_con_notifysize), panel_pos.y);
draw_endBoldFont();
pos.y += sb_heading_fontsize.y;
- pos.y += panel_bg_border;
+ if(panel.current_panel_bg != "0")
+ pos.y += panel_bg_border;
// Draw the scoreboard
float scale = autocvar_hud_panel_scoreboard_table_bg_scale;
if(teamplay)
{
vector panel_bg_color_save = panel_bg_color;
- vector team_score_baseoffset = eY * hud_fontsize.y - eX * (panel_bg_border + hud_fontsize.x * 0.5);
+ vector team_score_baseoffset = eY * hud_fontsize.y - eX * hud_fontsize.x * 0.5;
+ if(panel.current_panel_bg != "0")
+ team_score_baseoffset.x -= panel_bg_border;
for(tm = teams.sort_next; tm; tm = tm.sort_next)
{
if(tm.team == NUM_SPECTATOR)
continue;
- if(!tm.team && teamplay)
+ if(!tm.team)
continue;
draw_beginBoldFont();
{
if(tm.team == NUM_SPECTATOR)
continue;
- if(!tm.team && teamplay)
- continue;
pos = Scoreboard_MakeTable(pos, tm, panel_bg_color, bg_size);
}
{
// 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..."),
- (autocvar_hud_panel_scoreboard_respawntime_decimals ?
- count_seconds_decs(respawn_time - time, autocvar_hud_panel_scoreboard_respawntime_decimals)
- :
- count_seconds(respawn_time - time)
- )
- );
+ if(respawn_time < time) // it happens for a few frames when server is respawning the player
+ str = ""; // draw an empty string to not change suddenly scoreboard_bottom
+ else
+ str = sprintf(_("^1Respawning in ^3%s^1..."),
+ (autocvar_hud_panel_scoreboard_respawntime_decimals ?
+ count_seconds_decs(respawn_time - time, autocvar_hud_panel_scoreboard_respawntime_decimals)
+ :
+ count_seconds(ceil(respawn_time - time))
+ )
+ );
}
else if(time < respawn_time)
{
(autocvar_hud_panel_scoreboard_respawntime_decimals ?
count_seconds_decs(respawn_time - time, autocvar_hud_panel_scoreboard_respawntime_decimals)
:
- count_seconds(respawn_time - time)
+ count_seconds(ceil(respawn_time - time))
)
);
}