X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fclient%2Fscoreboard.qc;h=cc605d630a49b14e39ceb7e5a74ace0a5184fac7;hp=44b820ebc7a7acadb5faebe2da7265136193e630;hb=f8fd182f4c9d44790436a2e1aff424c1bdeeb6da;hpb=7bcb3a89b3271e018da4d92437dc5ba125ea8698 diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index 44b820ebc7..cc605d630a 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -1,13 +1,14 @@ #include "scoreboard.qh" -#include "quickmenu.qh" +#include "hud/panel/quickmenu.qh" #include "hud/all.qh" -#include "../common/constants.qh" -#include "../common/mapinfo.qh" -#include "../common/minigames/cl_minigames.qh" -#include "../common/stats.qh" -#include "../common/teams.qh" +#include +#include +#include +#include +#include +#include float scoreboard_alpha_bg; float scoreboard_alpha_fg; @@ -127,8 +128,9 @@ void HUD_UpdatePlayerTeams() */ } -int HUD_CompareScore(float vl, float vr, int f) +int HUD_CompareScore(int vl, int vr, int f) { + TC(int, vl); TC(int, vr); TC(int, f); if(f & SFL_ZERO_IS_WORST) { if(vl == 0 && vr != 0) @@ -192,13 +194,14 @@ float HUD_ComparePlayerScores(entity left, entity right) void HUD_UpdatePlayerPos(entity player) { - for(other = player.sort_next; other && HUD_ComparePlayerScores(player, other); other = player.sort_next) + entity ent; + for(ent = player.sort_next; ent && HUD_ComparePlayerScores(player, ent); ent = player.sort_next) { - SORT_SWAP(player, other); + SORT_SWAP(player, ent); } - for(other = player.sort_prev; other != players && HUD_ComparePlayerScores(other, player); other = player.sort_prev) + for(ent = player.sort_prev; ent != players && HUD_ComparePlayerScores(ent, player); ent = player.sort_prev) { - SORT_SWAP(other, player); + SORT_SWAP(ent, player); } } @@ -234,13 +237,14 @@ float HUD_CompareTeamScores(entity left, entity right) void HUD_UpdateTeamPos(entity Team) { - for(other = Team.sort_next; other && HUD_CompareTeamScores(Team, other); other = Team.sort_next) + entity ent; + for(ent = Team.sort_next; ent && HUD_CompareTeamScores(Team, ent); ent = Team.sort_next) { - SORT_SWAP(Team, other); + SORT_SWAP(Team, ent); } - for(other = Team.sort_prev; other != teams && HUD_CompareTeamScores(other, Team); other = Team.sort_prev) + for(ent = Team.sort_prev; ent != teams && HUD_CompareTeamScores(ent, Team); ent = Team.sort_prev) { - SORT_SWAP(other, Team); + SORT_SWAP(ent, Team); } } @@ -301,19 +305,28 @@ void Cmd_HUD_Help() "other gamemodes except DM.\n")); } -#define HUD_DefaultColumnLayout() \ -"ping pl name | " \ -"-teams,cts,lms/kills +ft,tdm/kills -teams,lms/deaths +ft,tdm/deaths -teams,lms,rc,ka/suicides +ft,tdm/suicides -cts,dm,tdm,ka,ft/frags " /* tdm already has this in "score" */ \ -"-rc,cts,nb/dmg -rc,cts,nb/dmgtaken " \ -"+ctf/caps +ctf/pickups +ctf/fckills +ctf/returns +ons/caps +ons/takes " \ -"+lms/lives +lms/rank " \ -"+kh/caps +kh/pushes +kh/destroyed " \ -"?+rc/laps ?+rc/time ?+rc/fastest " \ -"+as/objectives +nb/faults +nb/goals +ka/pickups +ka/bckills +ka/bctime +ft/revivals " \ -"-lms,rc,nb/score" - -void Cmd_HUD_SetFields(float argc) +// NOTE: adding a gametype with ? to not warn for an optional field +// make sure it's excluded in a previous exclusive rule, if any +// otherwise the previous exclusive rule warns anyway +// e.g. -teams,rc,cts,lms/kills ?+rc/kills +#define SCOREBOARD_DEFAULT_COLUMNS \ +"ping pl name |" \ +" -teams,rc,cts,inv,lms/kills +ft,tdm/kills ?+rc,inv/kills" \ +" -teams,lms/deaths +ft,tdm/deaths" \ +" -teams,lms,rc,cts,inv,ka/suicides +ft,tdm/suicides ?+rc,inv/suicides" \ +" -cts,dm,tdm,ka,ft/frags" /* tdm already has this in "score" */ \ +" -rc,cts,nb/dmg -rc,cts,nb/dmgtaken" \ +" +ctf/caps +ctf/pickups +ctf/fckills +ctf/returns +ons/caps +ons/takes" \ +" +lms/lives +lms/rank" \ +" +kh/caps +kh/pushes +kh/destroyed" \ +" ?+rc/laps ?+rc/time +rc,cts/fastest" \ +" +as/objectives +nb/faults +nb/goals" \ +" +ka/pickups +ka/bckills +ka/bctime +ft/revivals" \ +" -lms,rc,cts,inv,nb/score" + +void Cmd_HUD_SetFields(int argc) { + TC(int, argc); int i, j, slash; string str, pattern; float have_name = 0, have_primary = 0, have_secondary = 0, have_separator = 0; @@ -334,12 +347,12 @@ void Cmd_HUD_SetFields(float argc) argc = tokenizebyseparator(strcat("0 1 ", autocvar_scoreboard_columns), " "); if(argc < 3) - argc = tokenizebyseparator(strcat("0 1 ", HUD_DefaultColumnLayout()), " "); + argc = tokenizebyseparator(strcat("0 1 ", SCOREBOARD_DEFAULT_COLUMNS), " "); if(argc == 3) { if(argv(2) == "default") - argc = tokenizebyseparator(strcat("0 1 ", HUD_DefaultColumnLayout()), " "); + argc = tokenizebyseparator(strcat("0 1 ", SCOREBOARD_DEFAULT_COLUMNS), " "); else if(argv(2) == "all") { string s; @@ -394,7 +407,6 @@ void Cmd_HUD_SetFields(float argc) { case "ping": hud_field[hud_num_fields] = SP_PING; break; case "pl": hud_field[hud_num_fields] = SP_PL; break; - case "pl": hud_field[hud_num_fields] = SP_PL; break; case "kd": case "kdr": case "kdratio": case "k/d": hud_field[hud_num_fields] = SP_KDRATIO; break; case "sum": case "diff": case "k-d": hud_field[hud_num_fields] = SP_SUM; break; case "name": case "nick": hud_field[hud_num_fields] = SP_NAME; have_name = true; break; @@ -407,7 +419,7 @@ void Cmd_HUD_SetFields(float argc) if(str == strtolower(scores_label[j])) goto found; // sorry, but otherwise fteqcc -O3 miscompiles this and warns about "unreachable code" -:notfound +LABEL(notfound) if(str == "frags") j = SP_FRAGS; else @@ -416,7 +428,7 @@ void Cmd_HUD_SetFields(float argc) LOG_INFOF("^1Error:^7 Unknown score field: '%s'\n", str); continue; } -:found +LABEL(found) hud_field[hud_num_fields] = j; if(j == ps_primary) have_primary = 1; @@ -515,6 +527,7 @@ float hud_field_icon1_alpha; float hud_field_icon2_alpha; string HUD_GetField(entity pl, int field) { + TC(int, field); float tmp, num, denom; int f; string str; @@ -639,6 +652,7 @@ float hud_fixscoreboardcolumnwidth_marginlen; string HUD_FixScoreboardColumnWidth(int i, string str) { + TC(int, i); float field, f; vector sz; field = hud_field[i]; @@ -703,8 +717,9 @@ string HUD_FixScoreboardColumnWidth(int i, string str) return str; } -void HUD_PrintScoreboardItem(vector pos, vector item_size, entity pl, float is_self, int pl_number) +void HUD_PrintScoreboardItem(vector pos, vector item_size, entity pl, bool is_self, int pl_number) { + TC(bool, is_self); TC(int, pl_number); vector tmp, rgb; rgb = Team_ColorRGB(pl.team); string str; @@ -974,9 +989,7 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz } float HUD_WouldDrawScoreboard() { - if (autocvar__hud_configure) - return 0; - else if (QuickMenu_IsOpened()) + if (QuickMenu_IsOpened()) return 0; else if (HUD_Radar_Clickable()) return 0; @@ -996,18 +1009,17 @@ float HUD_WouldDrawScoreboard() { float average_accuracy; vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) { - SELFPARAM(); WepSet weapons_stat = WepSet_GetFromStat(); WepSet weapons_inmap = WepSet_GetFromStat_InMap(); float initial_posx = pos.x; int disownedcnt = 0; - FOREACH(Weapons, it != WEP_Null, LAMBDA( + FOREACH(Weapons, it != WEP_Null, { int weapon_stats = weapon_accuracy[i - WEP_FIRST]; WepSet set = it.m_wepset; if (weapon_stats < 0 && !(weapons_stat & set || weapons_inmap & set)) ++disownedcnt; - )); + }); int weapon_cnt = (Weapons_COUNT - 1) - disownedcnt; if (weapon_cnt <= 0) return pos; @@ -1061,7 +1073,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) vector tmpos = pos; int column = 0; - FOREACH(Weapons, it != WEP_Null, LAMBDA( + FOREACH(Weapons, it != WEP_Null, { int weapon_stats = weapon_accuracy[i - WEP_FIRST]; WepSet set = it.m_wepset; @@ -1100,7 +1112,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) pos.y += height; } ++column; - )); + }); if (weapons_with_stats) average_accuracy = floor((average_accuracy * 100 / weapons_with_stats) + 0.5); @@ -1241,52 +1253,85 @@ float hud_woulddrawscoreboard_prev; float hud_woulddrawscoreboard_change; // "time" at which HUD_WouldDrawScoreboard() changed void HUD_DrawScoreboard() { - float hud_woulddrawscoreboard; - hud_woulddrawscoreboard = scoreboard_active; - if(hud_woulddrawscoreboard != hud_woulddrawscoreboard_prev) { - hud_woulddrawscoreboard_change = time; - hud_woulddrawscoreboard_prev = hud_woulddrawscoreboard; - } + if(!autocvar__hud_configure) + { + float hud_woulddrawscoreboard; + hud_woulddrawscoreboard = scoreboard_active; + if(hud_woulddrawscoreboard != hud_woulddrawscoreboard_prev) { + hud_woulddrawscoreboard_change = time; + hud_woulddrawscoreboard_prev = hud_woulddrawscoreboard; + } + + if(hud_woulddrawscoreboard) { + if(menu_enabled == 1) + scoreboard_fade_alpha = 1; + float scoreboard_fadeinspeed = autocvar_scoreboard_fadeinspeed; + if (scoreboard_fadeinspeed) + scoreboard_fade_alpha = bound (0, (time - hud_woulddrawscoreboard_change) * scoreboard_fadeinspeed, 1); + else + scoreboard_fade_alpha = 1; + } + else { + float scoreboard_fadeoutspeed = autocvar_scoreboard_fadeoutspeed; + if (scoreboard_fadeoutspeed) + scoreboard_fade_alpha = bound (0, (1/scoreboard_fadeoutspeed - (time - hud_woulddrawscoreboard_change)) * scoreboard_fadeoutspeed, 1); + else + scoreboard_fade_alpha = 0; + } - if(hud_woulddrawscoreboard) { - float scoreboard_fadeinspeed = autocvar_scoreboard_fadeinspeed; - if (scoreboard_fadeinspeed) - scoreboard_fade_alpha = bound (0, (time - hud_woulddrawscoreboard_change) * scoreboard_fadeinspeed, 1); - else - scoreboard_fade_alpha = 1; - } - else { - float scoreboard_fadeoutspeed = autocvar_scoreboard_fadeoutspeed; - if (scoreboard_fadeoutspeed) - scoreboard_fade_alpha = bound (0, (1/scoreboard_fadeoutspeed - (time - hud_woulddrawscoreboard_change)) * scoreboard_fadeoutspeed, 1); - else - scoreboard_fade_alpha = 0; + if (!scoreboard_fade_alpha) + return; } + else + scoreboard_fade_alpha = 0; - if (!scoreboard_fade_alpha) - return; + if (autocvar_scoreboard_dynamichud) + HUD_Scale_Enable(); + else + HUD_Scale_Disable(); - HUD_UpdatePlayerTeams(); + 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(); - scoreboard_alpha_bg = autocvar_scoreboard_alpha_bg * scoreboard_fade_alpha * (1 - autocvar__menu_alpha); - scoreboard_alpha_fg = autocvar_scoreboard_alpha_fg * scoreboard_fade_alpha * (1 - autocvar__menu_alpha); + scoreboard_alpha_bg = autocvar_scoreboard_alpha_bg * panel_fg_alpha; + scoreboard_alpha_fg = autocvar_scoreboard_alpha_fg * panel_fg_alpha; scoreboard_highlight = autocvar_scoreboard_highlight; - scoreboard_highlight_alpha = autocvar_scoreboard_highlight_alpha * scoreboard_alpha_fg; - scoreboard_highlight_alpha_self = autocvar_scoreboard_highlight_alpha_self * scoreboard_alpha_fg; - scoreboard_alpha_name = autocvar_scoreboard_alpha_name * scoreboard_alpha_fg; - scoreboard_alpha_name_self = autocvar_scoreboard_alpha_name_self * scoreboard_alpha_fg; + scoreboard_highlight_alpha = autocvar_scoreboard_highlight_alpha * panel_fg_alpha; + scoreboard_highlight_alpha_self = autocvar_scoreboard_highlight_alpha_self * panel_fg_alpha; + scoreboard_alpha_name = autocvar_scoreboard_alpha_name * panel_fg_alpha; + scoreboard_alpha_name_self = autocvar_scoreboard_alpha_name_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); + + HUD_Panel_DrawBg(scoreboard_fade_alpha); + + if(panel_bg_padding) + { + panel_pos += '1 1 0' * panel_bg_padding; + panel_size -= '2 2 0' * panel_bg_padding; + } + + HUD_UpdatePlayerTeams(); vector rgb, pos, tmp; entity pl, tm; string str; - xmin = (autocvar_scoreboard_offset_left * vid_conwidth); - ymin = max((autocvar_con_notify * autocvar_con_notifysize), (autocvar_scoreboard_offset_vertical * vid_conwidth)); + xmin = panel_pos_x; + ymin = panel_pos_y; - xmax = ((1 - autocvar_scoreboard_offset_right) * vid_conwidth); - ymax = (vid_conheight - ymin); + xmax = panel_pos_x + panel_size_x; + ymax = panel_pos_y + panel_size_y; - sbwidth = xmax - xmin; + sbwidth = panel_size_x; // Initializes position pos.x = xmin; @@ -1303,7 +1348,7 @@ void HUD_DrawScoreboard() pos.y += sb_heading_fontsize.y + hud_fontsize.y * 0.25; // Draw the scoreboard - vector bg_size = draw_getimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale; + vector bg_size = draw_getimagesize("gfx/scoreboard/scoreboard_bg") * ((autocvar_scoreboard_bg_scale > 0) ? autocvar_scoreboard_bg_scale : 0.25); if(teamplay) { @@ -1313,6 +1358,8 @@ void HUD_DrawScoreboard() { if(tm.team == NUM_SPECTATOR) continue; + if(!tm.team && teamplay) + continue; draw_beginBoldFont(); rgb = Team_ColorRGB(tm.team); @@ -1342,6 +1389,8 @@ void HUD_DrawScoreboard() { if(tm.team == NUM_SPECTATOR) continue; + if(!tm.team && teamplay) + continue; pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size); } @@ -1349,11 +1398,11 @@ void HUD_DrawScoreboard() if(gametype == MAPINFO_TYPE_CTS || gametype == MAPINFO_TYPE_RACE) { if(race_speedaward) { - drawcolorcodedstring(pos, sprintf(_("Speed award: %d ^7(%s^7)"), race_speedaward, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos, sprintf(_("Speed award: %d%s ^7(%s^7)"), race_speedaward, race_speedaward_unit, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos.y += 1.25 * hud_fontsize.y; } if(race_speedaward_alltimebest) { - drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); + drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d%s ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_unit, race_speedaward_alltimebest_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); pos.y += 1.25 * hud_fontsize.y; } pos = HUD_DrawScoreboardRankings(pos, playerslots[player_localnum], rgb, bg_size);