#include "scoreboard.qh"
#include <client/autocvars.qh>
-#include <client/main.qh>
-#include <client/miscfunctions.qh>
+#include <client/draw.qh>
+#include <client/hud/panel/quickmenu.qh>
#include <client/hud/panel/racetimer.qh>
-#include "quickmenu.qh"
-#include <common/ent_cs.qh>
+#include <client/hud/panel/weapons.qh>
#include <common/constants.qh>
-#include <common/net_linked.qh>
+#include <common/ent_cs.qh>
#include <common/mapinfo.qh>
#include <common/minigames/cl_minigames.qh>
+#include <common/net_linked.qh>
#include <common/scores.qh>
#include <common/stats.qh>
#include <common/teams.qh>
+#include <common/items/inventory.qh>
// Scoreboard (#24)
float autocvar_hud_panel_scoreboard_accuracy_showdelay = 2;
float autocvar_hud_panel_scoreboard_accuracy_showdelay_minpos = 0.75;
+bool autocvar_hud_panel_scoreboard_itemstats = true;
+bool autocvar_hud_panel_scoreboard_itemstats_doublerows = false;
+bool autocvar_hud_panel_scoreboard_itemstats_filter = true;
+float autocvar_hud_panel_scoreboard_itemstats_showdelay = 2.2; // slightly more delayed than accuracy
+float autocvar_hud_panel_scoreboard_itemstats_showdelay_minpos = 0.75;
+
bool autocvar_hud_panel_scoreboard_dynamichud = false;
float autocvar_hud_panel_scoreboard_maxheight = 0.6;
return initial_pos + (end_pos - initial_pos) * scoreboard_acc_fade_alpha;
}
+.bool uninteresting;
+STATIC_INIT(default_order_items_label)
+{
+ IL_EACH(default_order_items, true, {
+ switch(it.netname)
+ {
+ case "bullets":
+ case "cells":
+ case "plasma":
+ case "rockets":
+ case "shells":
+ case "vaporizer_cells":
+ case "fuel":
+ case "armor_small":
+ case "armor_medium":
+ case "health_small":
+ case "health_medium":
+ it.uninteresting = true;
+ }
+ });
+}
+
+vector Scoreboard_ItemStats_Draw(vector pos, vector rgb, vector bg_size)
+{
+ float scoreboard_acc_fade_alpha_save = scoreboard_acc_fade_alpha; // debug
+ scoreboard_acc_fade_alpha = 1; // debug: make Item Stats always visible
+
+ float initial_posx = pos.x;
+ int disowned_cnt = 0;
+ int uninteresting_cnt = 0;
+ IL_EACH(default_order_items, true, {
+ int q = g_inventory.inv_items[it.m_id];
+ //q = 1; // debug: display all items
+ if (autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting)
+ ++uninteresting_cnt;
+ else if (!q)
+ ++disowned_cnt;
+ });
+ int items_cnt = REGISTRY_COUNT(Items) - uninteresting_cnt;
+ int n = items_cnt - disowned_cnt;
+ if (n <= 0) return pos;
+
+ int rows = (autocvar_hud_panel_scoreboard_itemstats_doublerows && n >= floor(REGISTRY_COUNT(Items) / 2)) ? 2 : 1;
+ int columnns = max(6, ceil(n / rows));
+
+ float height = 40;
+ float fontsize = height * 1/3;
+ float item_height = height * 2/3;
+
+ drawstring(pos, _("Item stats"), hud_fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ pos.y += 1.25 * hud_fontsize.y;
+ 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;
+
+ float panel_bg_alpha_save = panel_bg_alpha;
+ panel_bg_alpha *= scoreboard_acc_fade_alpha;
+ HUD_Panel_DrawBg();
+ panel_bg_alpha = panel_bg_alpha_save;
+
+ 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)
+ {
+ panel_pos += '1 1 0' * panel_bg_padding;
+ panel_size -= '2 2 0' * panel_bg_padding;
+ }
+
+ pos = panel_pos;
+ vector tmp = panel_size;
+
+ float item_width = tmp.x / columnns / rows;
+
+ if (sbt_bg_alpha)
+ drawpic_tiled(pos, "gfx/scoreboard/scoreboard_bg", bg_size, tmp, rgb, sbt_bg_alpha * scoreboard_acc_fade_alpha, DRAWFLAG_NORMAL);
+
+ if(sbt_highlight)
+ {
+ // column highlighting
+ for (int i = 0; i < columnns; ++i)
+ if ((i % 2) == 0)
+ drawfill(pos + '1 0 0' * item_width * rows * i, '0 1 0' * height * rows + '1 0 0' * item_width * rows, '0 0 0', panel_bg_alpha * 0.2, DRAWFLAG_NORMAL);
+
+ // row highlighting
+ for (int i = 0; i < rows; ++i)
+ drawfill(pos + '0 1 0' * item_height + '0 1 0' * height * i, '1 0 0' * panel_size.x + '0 1 0' * fontsize, '1 1 1', sbt_highlight_alpha, DRAWFLAG_NORMAL);
+ }
+
+ if (rows == 2)
+ pos.x += item_width / 2;
+
+ float oldposx = pos.x;
+ vector tmpos = pos;
+
+ int column = 0;
+ IL_EACH(default_order_items, !(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting), {
+ int n = g_inventory.inv_items[it.m_id];
+ //n = 1 + floor(i * 3 + 4.8) % 7; // debug: display a value for each item
+ if (n <= 0) continue;
+ drawpic_aspect_skin(tmpos, it.m_icon, '1 0 0' * item_width + '0 1 0' * item_height, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ string s = ftos(n);
+ float padding = (item_width - stringwidth(s, false, '1 0 0' * fontsize)) / 2; // center
+ drawstring(tmpos + '1 0 0' * padding + '0 1 0' * item_height, s, '1 1 0' * fontsize, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
+ tmpos.x += item_width * rows;
+ pos.x += item_width * rows;
+ if (rows == 2 && column == columnns - 1) {
+ tmpos.x = oldposx;
+ tmpos.y += height;
+ pos.y += height;
+ }
+ ++column;
+ });
+ pos.y += height;
+ pos.y += 1.25 * hud_fontsize.y;
+ pos.x = initial_posx;
+
+ panel_size.x += panel_bg_padding * 2; // restore initial width
+
+ scoreboard_acc_fade_alpha = scoreboard_acc_fade_alpha_save; // debug
+ return pos;
+}
+
vector MapStats_DrawKeyValue(vector pos, string key, string value) {
float px = pos.x;
pos.x += hud_fontsize.x * 0.25;
return true;
}
+bool have_item_stats;
+bool Scoreboard_ItemStats_WouldDraw(float ypos)
+{
+ if (MUTATOR_CALLHOOK(DrawScoreboardItemStats))
+ return false;
+ if (!autocvar_hud_panel_scoreboard_itemstats || warmup_stage || ypos > 0.91 * vid_conheight)
+ return false;
+
+ if (time < scoreboard_time + autocvar_hud_panel_scoreboard_itemstats_showdelay
+ && ypos > autocvar_hud_panel_scoreboard_itemstats_showdelay_minpos * vid_conheight
+ && !intermission)
+ {
+ return false;
+ }
+
+ if (!have_item_stats)
+ {
+ IL_EACH(default_order_items, true, {
+ if (!(autocvar_hud_panel_scoreboard_itemstats_filter && it.uninteresting))
+ {
+ int q = g_inventory.inv_items[it.m_id];
+ //q = 1; // debug: display all items
+ if (q)
+ {
+ have_item_stats = true;
+ break;
+ }
+ }
+ });
+ if (!have_item_stats)
+ return false;
+ }
+
+ return true;
+}
+
void Scoreboard_Draw()
{
if(!autocvar__hud_configure)
if (Scoreboard_AccuracyStats_WouldDraw(pos.y))
pos = Scoreboard_AccuracyStats_Draw(pos, panel_bg_color, bg_size);
+ if (Scoreboard_ItemStats_WouldDraw(pos.y))
+ pos = Scoreboard_ItemStats_Draw(pos, panel_bg_color, bg_size);
if(MUTATOR_CALLHOOK(ShowRankings)) {
string ranktitle = M_ARGV(0, string);