X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fscoreboard.qc;h=44b820ebc7a7acadb5faebe2da7265136193e630;hb=c6fae88a462bf6e5ded37ac2fcdde0f844be9314;hp=3b74f5932b0d5b9c861f1cd121b42711762947fc;hpb=737346fcfbe5912ff5de24c2f22c0dbd894429a6;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index 3b74f5932..44b820ebc 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -1,14 +1,13 @@ #include "scoreboard.qh" -#include "_all.qh" -#include "hud.qh" +#include "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 "../common/util.qh" float scoreboard_alpha_bg; float scoreboard_alpha_fg; @@ -34,6 +33,8 @@ string TranslateScoresLabel(string l) case "captime": return CTX(_("SCO^captime")); case "deaths": return CTX(_("SCO^deaths")); case "destroyed": return CTX(_("SCO^destroyed")); + case "dmg": return CTX(_("SCO^dmg")); + case "dmgtaken": return CTX(_("SCO^dmgtaken")); case "drops": return CTX(_("SCO^drops")); case "faults": return CTX(_("SCO^faults")); case "fckills": return CTX(_("SCO^fckills")); @@ -108,7 +109,7 @@ void HUD_UpdatePlayerTeams() for(pl = players.sort_next; pl; pl = pl.sort_next) { num += 1; - Team = GetPlayerColor(pl.sv_entnum); + Team = entcs_GetScoreTeam(pl.sv_entnum); if(SetTeam(pl, Team)) { tmp = pl.sort_prev; @@ -145,8 +146,8 @@ int HUD_CompareScore(float vl, float vr, int f) float HUD_ComparePlayerScores(entity left, entity right) { float vl, vr, r; - vl = GetPlayerColor(left.sv_entnum); - vr = GetPlayerColor(right.sv_entnum); + vl = entcs_GetTeam(left.sv_entnum); + vr = entcs_GetTeam(right.sv_entnum); if(!left.gotscores) vl = NUM_SPECTATOR; @@ -261,6 +262,8 @@ void Cmd_HUD_Help() LOG_INFO(_("^3suicides^7 Number of suicides\n")); LOG_INFO(_("^3frags^7 kills - suicides\n")); LOG_INFO(_("^3kd^7 The kill-death ratio\n")); + LOG_INFO(_("^3dmg^7 The total damage done\n")); + LOG_INFO(_("^3dmgtaken^7 The total damage taken\n")); LOG_INFO(_("^3sum^7 frags - deaths\n")); LOG_INFO(_("^3caps^7 How often a flag (CTF) or a key (KeyHunt) was captured\n")); LOG_INFO(_("^3pickups^7 How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up\n")); @@ -300,13 +303,14 @@ void Cmd_HUD_Help() #define HUD_DefaultColumnLayout() \ "ping pl name | " \ -"-teams,race,lms/kills +ft,tdm/kills -teams,lms/deaths +ft,tdm/deaths -teams,lms,race,ka/suicides +ft,tdm/suicides -race,dm,tdm,ka,ft/frags " /* tdm already has this in "score" */ \ +"-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 " \ -"?+race/laps ?+race/time ?+race/fastest " \ +"?+rc/laps ?+rc/time ?+rc/fastest " \ "+as/objectives +nb/faults +nb/goals +ka/pickups +ka/bckills +ka/bctime +ft/revivals " \ -"-lms,race,nb/score" +"-lms,rc,nb/score" void Cmd_HUD_SetFields(float argc) { @@ -386,41 +390,40 @@ void Cmd_HUD_SetFields(float argc) hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], false, hud_fontsize); str = strtolower(str); - if(str == "ping") { - hud_field[hud_num_fields] = SP_PING; - } else if(str == "pl") { - hud_field[hud_num_fields] = SP_PL; - } else if(str == "kd" || str == "kdr" || str == "kdratio" || str == "k/d") { - hud_field[hud_num_fields] = SP_KDRATIO; - } else if(str == "sum" || str == "diff" || str == "k-d") { - hud_field[hud_num_fields] = SP_SUM; - } else if(str == "name" || str == "nick") { - hud_field[hud_num_fields] = SP_NAME; - have_name = 1; - } else if(str == "|") { - hud_field[hud_num_fields] = SP_SEPARATOR; - have_separator = 1; - } else { - for(j = 0; j < MAX_SCORE; ++j) - if(str == strtolower(scores_label[j])) - goto found; // sorry, but otherwise fteqcc -O3 miscompiles this and warns about "unreachable code" -:notfound - if(str == "frags") - { - j = SP_FRAGS; - } - else + switch(str) + { + 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; + case "|": hud_field[hud_num_fields] = SP_SEPARATOR; have_separator = true; break; + case "dmg": hud_field[hud_num_fields] = SP_DMG; break; + case "dmgtaken": hud_field[hud_num_fields] = SP_DMGTAKEN; break; + default: { - if (!nocomplain) - LOG_INFOF("^1Error:^7 Unknown score field: '%s'\n", str); - continue; - } + for(j = 0; j < MAX_SCORE; ++j) + if(str == strtolower(scores_label[j])) + goto found; // sorry, but otherwise fteqcc -O3 miscompiles this and warns about "unreachable code" + +:notfound + if(str == "frags") + j = SP_FRAGS; + else + { + if(!nocomplain) + LOG_INFOF("^1Error:^7 Unknown score field: '%s'\n", str); + continue; + } :found - hud_field[hud_num_fields] = j; - if(j == ps_primary) - have_primary = 1; - if(j == ps_secondary) - have_secondary = 1; + hud_field[hud_num_fields] = j; + if(j == ps_primary) + have_primary = 1; + if(j == ps_secondary) + have_secondary = 1; + + } } ++hud_num_fields; if(hud_num_fields >= MAX_HUD_FIELDS) @@ -568,7 +571,7 @@ string HUD_GetField(entity pl, int field) hud_field_icon2_rgb = colormapPaletteColor(f % 16, 1); } } - return GetPlayerName(pl.sv_entnum); + return entcs_GetName(pl.sv_entnum); case SP_FRAGS: f = pl.(scores[SP_KILLS]); @@ -602,6 +605,20 @@ string HUD_GetField(entity pl, int field) } return ftos(f); + case SP_DMG: + num = pl.(scores[SP_DMG]); + denom = 1000; + + str = sprintf("%.1f k", num/denom); + return str; + + case SP_DMGTAKEN: + num = pl.(scores[SP_DMGTAKEN]); + denom = 1000; + + str = sprintf("%.1f k", num/denom); + return str; + default: tmp = pl.(scores[field]); f = scores_flags[field]; @@ -693,7 +710,7 @@ void HUD_PrintScoreboardItem(vector pos, vector item_size, entity pl, float is_s string str; int field; float is_spec; - is_spec = (GetPlayerColor(pl.sv_entnum) == NUM_SPECTATOR); + is_spec = (entcs_GetTeam(pl.sv_entnum) == NUM_SPECTATOR); if((rgb == '1 1 1') && (!is_spec)) { rgb.x = autocvar_scoreboard_color_bg_r + 0.5; @@ -959,6 +976,8 @@ 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()) + return 0; else if (HUD_Radar_Clickable()) return 0; else if (scoreboard_showscores) @@ -967,7 +986,7 @@ float HUD_WouldDrawScoreboard() { return 1; else if (intermission == 2) return 0; - else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS && !active_minigame) + else if (spectatee_status != -1 && STAT(HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != MAPINFO_TYPE_CTS && !active_minigame) return 1; else if (scoreboard_showscores_force) return 1; @@ -977,34 +996,25 @@ 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 i; - float weapon_stats; int disownedcnt = 0; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - { - self = get_weaponinfo(i); - if(!self.weapon) - continue; + FOREACH(Weapons, it != WEP_Null, LAMBDA( + int weapon_stats = weapon_accuracy[i - WEP_FIRST]; - weapon_stats = weapon_accuracy[i-WEP_FIRST]; - - if(weapon_stats < 0 && !(weapons_stat & WepSet_FromWeapon(i) || weapons_inmap & WepSet_FromWeapon(i))) + WepSet set = it.m_wepset; + if (weapon_stats < 0 && !(weapons_stat & set || weapons_inmap & set)) ++disownedcnt; - } + )); - int weapon_cnt = WEP_COUNT - disownedcnt; - - if(weapon_cnt <= 0) - return pos; + int weapon_cnt = (Weapons_COUNT - 1) - disownedcnt; + if (weapon_cnt <= 0) return pos; - int rows; - if(autocvar_scoreboard_accuracy_doublerows && weapon_cnt >= floor(WEP_COUNT * 0.5)) + int rows = 1; + if (autocvar_scoreboard_accuracy_doublerows && weapon_cnt >= floor((Weapons_COUNT - 1) * 0.5)) rows = 2; - else - rows = 1; int columnns = ceil(weapon_cnt / rows); float height = 40; @@ -1025,24 +1035,24 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) drawborderlines(autocvar_scoreboard_border_thickness, pos, tmp, '0 0 0', scoreboard_alpha_bg * 0.75, DRAWFLAG_NORMAL); // column highlighting - for(i = 0; i < columnns; ++i) + for (int i = 0; i < columnns; ++i) { - if(!(i % 2)) + if ((i % 2) == 0) drawfill(pos + '1 0 0' * weapon_width * rows * i, '0 1 0' * height * rows + '1 0 0' * weapon_width * rows, '0 0 0', scoreboard_alpha_bg * 0.2, DRAWFLAG_NORMAL); } // row highlighting - for(i = 0; i < rows; ++i) + for (int i = 0; i < rows; ++i) { drawfill(pos + '0 1 0' * weapon_height + '0 1 0' * height * i, '1 0 0' * sbwidth + '0 1 0' * fontsize, '1 1 1', scoreboard_highlight_alpha, DRAWFLAG_NORMAL); } average_accuracy = 0; int weapons_with_stats = 0; - if(rows == 2) + if (rows == 2) pos.x += weapon_width / 2; - if(autocvar_scoreboard_accuracy_nocolors) + if (autocvar_scoreboard_accuracy_nocolors) rgb = '1 1 1'; else Accuracy_LoadColors(); @@ -1050,27 +1060,24 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) float oldposx = pos.x; vector tmpos = pos; - int column; - for(i = WEP_FIRST, column = 0; i <= WEP_LAST; ++i) - { - self = get_weaponinfo(i); - if (!self.weapon) - continue; - weapon_stats = weapon_accuracy[i-WEP_FIRST]; + int column = 0; + FOREACH(Weapons, it != WEP_Null, LAMBDA( + int weapon_stats = weapon_accuracy[i - WEP_FIRST]; - if(weapon_stats < 0 && !(weapons_stat & WepSet_FromWeapon(i) || weapons_inmap & WepSet_FromWeapon(i))) + WepSet set = it.m_wepset; + if (weapon_stats < 0 && !(weapons_stat & set || weapons_inmap & set)) continue; float weapon_alpha; - if(weapon_stats >= 0) + if (weapon_stats >= 0) weapon_alpha = scoreboard_alpha_fg; else weapon_alpha = 0.2 * scoreboard_alpha_fg; // weapon icon - drawpic_aspect_skin(tmpos, self.model2, '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); + drawpic_aspect_skin(tmpos, it.model2, '1 0 0' * weapon_width + '0 1 0' * weapon_height, '1 1 1', weapon_alpha, DRAWFLAG_NORMAL); // the accuracy - if(weapon_stats >= 0) { + if (weapon_stats >= 0) { weapons_with_stats += 1; average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy @@ -1087,15 +1094,15 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size) } tmpos.x += weapon_width * rows; pos.x += weapon_width * rows; - if(rows == 2 && column == columnns - 1) { + if (rows == 2 && column == columnns - 1) { tmpos.x = oldposx; tmpos.y += height; pos.y += height; } ++column; - } + )); - if(weapons_with_stats) + if (weapons_with_stats) average_accuracy = floor((average_accuracy * 100 / weapons_with_stats) + 0.5); pos.y += height; @@ -1123,12 +1130,12 @@ vector HUD_DrawMapStats(vector pos, vector rgb, vector bg_size) { string val; // get monster stats - stat_monsters_killed = getstatf(STAT_MONSTERS_KILLED); - stat_monsters_total = getstatf(STAT_MONSTERS_TOTAL); + stat_monsters_killed = STAT(MONSTERS_KILLED); + stat_monsters_total = STAT(MONSTERS_TOTAL); // get secrets stats - stat_secrets_found = getstatf(STAT_SECRETS_FOUND); - stat_secrets_total = getstatf(STAT_SECRETS_TOTAL); + stat_secrets_found = STAT(SECRETS_FOUND); + stat_secrets_total = STAT(SECRETS_TOTAL); // get number of rows if(stat_secrets_total) @@ -1187,7 +1194,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ return pos; float is_spec; - is_spec = (GetPlayerColor(pl.sv_entnum) == NUM_SPECTATOR); + is_spec = (entcs_GetTeam(pl.sv_entnum) == NUM_SPECTATOR); vector hl_rgb; hl_rgb.x = autocvar_scoreboard_color_bg_r + 0.5; hl_rgb.y = autocvar_scoreboard_color_bg_g + 0.5; @@ -1216,7 +1223,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl, vector rgb, vector bg_ continue; n = grecordholder[i]; p = count_ordinal(i+1); - if(grecordholder[i] == GetPlayerName(player_localnum)) + if(grecordholder[i] == entcs_GetName(player_localnum)) drawfill(pos, '1 0 0' * sbwidth + '0 1.25 0' * hud_fontsize.y, hl_rgb, scoreboard_highlight_alpha_self, DRAWFLAG_NORMAL); else if(!(i % 2) && scoreboard_highlight) drawfill(pos, '1 0 0' * sbwidth + '0 1.25 0' * hud_fontsize.y, hl_rgb, scoreboard_highlight_alpha, DRAWFLAG_NORMAL); @@ -1351,7 +1358,7 @@ void HUD_DrawScoreboard() } pos = HUD_DrawScoreboardRankings(pos, playerslots[player_localnum], rgb, bg_size); } - else if(autocvar_scoreboard_accuracy && spectatee_status == 0 && !warmup_stage && gametype != MAPINFO_TYPE_NEXBALL) { + else if (autocvar_scoreboard_accuracy && !warmup_stage && gametype != MAPINFO_TYPE_NEXBALL) { if(teamplay) pos = HUD_DrawScoreboardAccuracyStats(pos, Team_ColorRGB(myteam), bg_size); else @@ -1392,9 +1399,9 @@ void HUD_DrawScoreboard() // Print info string float tl, fl, ll; str = sprintf(_("playing ^3%s^7 on ^2%s^7"), MapInfo_Type_ToText(gametype), shortmapname); - tl = getstatf(STAT_TIMELIMIT); - fl = getstatf(STAT_FRAGLIMIT); - ll = getstatf(STAT_LEADLIMIT); + tl = STAT(TIMELIMIT); + fl = STAT(FRAGLIMIT); + ll = STAT(LEADLIMIT); if(gametype == MAPINFO_TYPE_LMS) { if(tl > 0) @@ -1448,7 +1455,7 @@ void HUD_DrawScoreboard() drawcolorcodedstring(pos + '0.5 0 0' * (sbwidth - stringwidth(str, true, hud_fontsize)), str, hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL); // print information about respawn status - float respawn_time = getstatf(STAT_RESPAWN_TIME); + float respawn_time = STAT(RESPAWN_TIME); if(!intermission) if(respawn_time) {