X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fhud%2Fpanel%2Fscoreboard.qc;h=82f96d02d55e60dbd89a603a551d2f4002addb9a;hb=4435e6a342e65c52cb1fc00aea84f6018eff16ac;hp=9965d58fb4ed257d341596517b046a33be301e48;hpb=d706cef7709c66bbeddd06b62d5a28288f95d44e;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/hud/panel/scoreboard.qc b/qcsrc/client/hud/panel/scoreboard.qc index 9965d58fb..82f96d02d 100644 --- a/qcsrc/client/hud/panel/scoreboard.qc +++ b/qcsrc/client/hud/panel/scoreboard.qc @@ -13,6 +13,7 @@ #include #include #include +#include // Scoreboard (#24) @@ -86,6 +87,12 @@ bool autocvar_hud_panel_scoreboard_accuracy_nocolors = false; 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; @@ -1088,7 +1095,7 @@ vector Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_size) panel_size.y += panel_bg_padding * 2; HUD_Panel_DrawBg(); - vector end_pos = panel_pos + eY * (panel_size.y + 0.5* hud_fontsize.y); + vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y); if(panel.current_panel_bg != "0") end_pos.y += panel_bg_border * 2; @@ -1178,14 +1185,7 @@ bool Scoreboard_WouldDraw() float average_accuracy; vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) { - if (frametime) - { - if (scoreboard_fade_alpha == 1) - scoreboard_acc_fade_alpha = min(1, scoreboard_acc_fade_alpha + frametime * 10); - else - scoreboard_acc_fade_alpha = 1; // sync fading with the scoreboard - } - vector initial_pos = pos; + scoreboard_acc_fade_alpha = min(scoreboard_fade_alpha, scoreboard_acc_fade_alpha + frametime * 10); WepSet weapons_stat = WepSet_GetFromStat(); WepSet weapons_inmap = WepSet_GetFromStat_InMap(); @@ -1234,7 +1234,7 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) HUD_Panel_DrawBg(); panel_bg_alpha = panel_bg_alpha_save; - vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y); + vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y); if(panel.current_panel_bg != "0") end_pos.y += panel_bg_border * 2; @@ -1326,9 +1326,120 @@ vector Scoreboard_AccuracyStats_Draw(vector pos, vector rgb, vector bg_size) panel_size.x += panel_bg_padding * 2; // restore initial width - if (scoreboard_acc_fade_alpha == 1) - return end_pos; - return initial_pos + (end_pos - initial_pos) * scoreboard_acc_fade_alpha; + return end_pos; +} + +.bool uninteresting; +STATIC_INIT(default_order_items_label) +{ + IL_EACH(default_order_items, true, { + if(!(it.instanceOfPowerup + || it == ITEM_HealthMega || it == ITEM_HealthBig + || it == ITEM_ArmorMega || it == ITEM_ArmorBig + )) + { + it.uninteresting = true; + } + }); +} + +vector Scoreboard_ItemStats_Draw(vector pos, vector rgb, vector bg_size) +{ + scoreboard_itemstats_fade_alpha = min(scoreboard_fade_alpha, scoreboard_itemstats_fade_alpha + frametime * 10); + + 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 + eX * panel_bg_padding, _("Item stats"), hud_fontsize, '1 1 1', panel_fg_alpha * scoreboard_itemstats_fade_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_itemstats_fade_alpha; + HUD_Panel_DrawBg(); + panel_bg_alpha = panel_bg_alpha_save; + + vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * 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_itemstats_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', sbt_highlight_alpha * scoreboard_itemstats_fade_alpha, 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, rgb, sbt_highlight_alpha * scoreboard_itemstats_fade_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 * scoreboard_itemstats_fade_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 * scoreboard_itemstats_fade_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; + }); + + panel_size.x += panel_bg_padding * 2; // restore initial width + + return end_pos; } vector MapStats_DrawKeyValue(vector pos, string key, string value) { @@ -1378,7 +1489,7 @@ vector Scoreboard_MapStats_Draw(vector pos, vector rgb, vector bg_size) { panel_size.y += panel_bg_padding * 2; HUD_Panel_DrawBg(); - vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y); + vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y); if(panel.current_panel_bg != "0") end_pos.y += panel_bg_border * 2; @@ -1464,7 +1575,7 @@ vector Scoreboard_Rankings_Draw(vector pos, string ranktitle, entity pl, vector HUD_Panel_DrawBg(); - vector end_pos = panel_pos + eY * (panel_size.y + hud_fontsize.y); + vector end_pos = panel_pos + eY * (panel_size.y + 0.5 * hud_fontsize.y); if(panel.current_panel_bg != "0") end_pos.y += panel_bg_border * 2; @@ -1552,6 +1663,42 @@ bool Scoreboard_AccuracyStats_WouldDraw(float ypos) return true; } +bool have_item_stats; +bool Scoreboard_ItemStats_WouldDraw(float ypos) +{ + if (MUTATOR_CALLHOOK(DrawScoreboardItemStats)) + return false; + if (!autocvar_hud_panel_scoreboard_itemstats || !g_inventory || 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) @@ -1560,7 +1707,7 @@ void Scoreboard_Draw() // frametime checks allow to toggle the scoreboard even when the game is paused if(scoreboard_active) { - if (scoreboard_fade_alpha < 1) + if (scoreboard_fade_alpha == 0) scoreboard_time = time; if(hud_configure_menu_open == 1) scoreboard_fade_alpha = 1; @@ -1587,6 +1734,7 @@ void Scoreboard_Draw() if (!scoreboard_fade_alpha) { scoreboard_acc_fade_alpha = 0; + scoreboard_itemstats_fade_alpha = 0; return; } } @@ -1622,6 +1770,7 @@ void Scoreboard_Draw() Scoreboard_UpdatePlayerTeams(); + float initial_pos_y = panel_pos.y; vector pos = panel_pos; entity pl, tm; string str; @@ -1835,6 +1984,8 @@ void Scoreboard_Draw() 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); @@ -1911,5 +2062,14 @@ void Scoreboard_Draw() drawcolorcodedstring(pos + '0.5 0 0' * (panel_size.x - stringwidth(str, true, hud_fontsize)), str, hud_fontsize, panel_fg_alpha, DRAWFLAG_NORMAL); } - scoreboard_bottom = pos.y + 2 * hud_fontsize.y; + pos.y += 2 * hud_fontsize.y; + if (scoreboard_fade_alpha < 1) + scoreboard_bottom = initial_pos_y + (pos.y - initial_pos_y) * scoreboard_fade_alpha; + else if (pos.y != scoreboard_bottom) + { + if (pos.y > scoreboard_bottom) + scoreboard_bottom = min(pos.y, scoreboard_bottom + frametime * 10 * (pos.y - initial_pos_y)); + else + scoreboard_bottom = max(pos.y, scoreboard_bottom - frametime * 10 * (pos.y - initial_pos_y)); + } }