3 #include "scoreboard.qh"
4 #include <common/ent_cs.qh>
5 #include <common/mapinfo.qh>
9 void HUD_UpdatePlayerTeams();
10 void HUD_Score_Rankings(vector pos, vector mySize, entity me)
14 int SCOREPANEL_MAX_ENTRIES = 6;
15 float SCOREPANEL_ASPECTRATIO = 2;
16 int entries = bound(1, floor(SCOREPANEL_MAX_ENTRIES * mySize.y/mySize.x * SCOREPANEL_ASPECTRATIO), SCOREPANEL_MAX_ENTRIES);
17 vector fontsize = '1 1 0' * (mySize.y/entries);
19 vector rgb, score_color;
21 score_color = '1 1 1';
23 float name_size = mySize.x*0.75;
24 float spacing_size = mySize.x*0.04;
25 const float highlight_alpha = 0.2;
26 int i = 0, first_pl = 0;
27 bool me_printed = false;
29 if (autocvar__hud_configure)
31 float players_per_team = 0;
34 // show team scores in the first line
35 float score_size = mySize.x / team_count;
36 players_per_team = max(2, ceil((entries - 1) / team_count));
37 for(i=0; i<team_count; ++i) {
38 if (i == floor((entries - 2) / players_per_team) || (entries == 1 && i == 0))
39 HUD_Panel_DrawHighlight(pos + eX * score_size * i, eX * score_size + eY * fontsize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
40 drawstring_aspect(pos + eX * score_size * i, ftos(175 - 23*i), eX * score_size + eY * fontsize.y, Team_ColorRGB(ColorByTeam(i)) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
45 score = 10 + SCOREPANEL_MAX_ENTRIES * 3;
46 for (i=first_pl; i<entries; ++i)
48 //simulate my score is lower than all displayed players,
49 //so that I don't appear at all showing pure rankings.
50 //This is to better show the difference between the 2 ranking views
51 if (i == entries-1 && autocvar_hud_panel_score_rankings == 1)
54 drawfill(pos, eX * mySize.x + eY * fontsize.y, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
55 s = entcs_GetName(player_localnum);
60 s = sprintf(_("Player %d"), i + 1 - first_pl);
65 score_color = Team_ColorRGB(ColorByTeam(floor((i - first_pl) / players_per_team))) * 0.8;
66 s = textShortenToWidth(s, name_size, fontsize, stringwidth_colors);
67 drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, true, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
68 drawstring(pos + eX * (name_size + spacing_size), ftos(score), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
74 if (!scoreboard_fade_alpha) // the scoreboard too calls HUD_UpdatePlayerTeams
75 HUD_UpdatePlayerTeams();
78 // show team scores in the first line
79 float score_size = mySize.x / team_count;
80 for(tm = teams.sort_next; tm; tm = tm.sort_next) {
81 if(tm.team == NUM_SPECTATOR)
83 if(!tm.team && teamplay)
85 if (tm.team == myteam)
86 drawfill(pos + eX * score_size * i, eX * score_size + eY * fontsize.y, '1 1 1', highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
87 drawstring_aspect(pos + eX * score_size * i, ftos(tm.(teamscores[ts_primary])), eX * score_size + eY * fontsize.y, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
97 for (pl = players.sort_next; pl && i<entries; pl = pl.sort_next)
99 if ((team_count && pl.team != tm.team) || pl.team == NUM_SPECTATOR)
102 if (i == entries-1 && !me_printed && pl != me)
103 if (autocvar_hud_panel_score_rankings == 1 && spectatee_status != -1)
105 for (pl = me.sort_next; pl; pl = pl.sort_next)
106 if (pl.team != NUM_SPECTATOR)
110 rgb = '1 1 0'; //not last but not among the leading players: yellow
112 rgb = '1 0 0'; //last: red
119 rgb = '0 1 0'; //first: green
121 drawfill(pos, eX * mySize.x + eY * fontsize.y, rgb, highlight_alpha * panel_fg_alpha, DRAWFLAG_NORMAL);
124 score_color = Team_ColorRGB(pl.team) * 0.8;
125 s = textShortenToWidth(entcs_GetName(pl.sv_entnum), name_size, fontsize, stringwidth_colors);
126 drawcolorcodedstring(pos + eX * (name_size - stringwidth(s, true, fontsize)), s, fontsize, panel_fg_alpha, DRAWFLAG_NORMAL);
127 drawstring(pos + eX * (name_size + spacing_size), ftos(pl.(scores[ps_primary])), fontsize, score_color, panel_fg_alpha, DRAWFLAG_NORMAL);
131 while (i<entries && team_count && (tm = tm.sort_next) && (tm.team != NUM_SPECTATOR || (tm = tm.sort_next)));
136 if(!autocvar__hud_configure)
138 if(!autocvar_hud_panel_score) return;
139 if(spectatee_status == -1 && (gametype == MAPINFO_TYPE_RACE || gametype == MAPINFO_TYPE_CTS)) return;
142 HUD_Panel_UpdateCvars();
147 if (autocvar_hud_panel_score_dynamichud)
154 pos += '1 1 0' * panel_bg_padding;
155 mySize -= '2 2 0' * panel_bg_padding;
158 float score, distribution = 0;
160 vector distribution_color;
163 me = playerslots[current_player];
165 if((scores_flags[ps_primary] & SFL_TIME) && !teamplay) { // race/cts record display on HUD
166 string timer, distrtimer;
168 pl = players.sort_next;
171 if(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)
172 if(pl.scores[ps_primary] == 0)
175 score = me.(scores[ps_primary]);
176 timer = TIME_ENCODED_TOSTRING(score);
178 draw_beginBoldFont();
179 if (pl && ((!(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)) || score)) {
180 // distribution display
181 distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
183 distrtimer = ftos_decimals(fabs(distribution/pow(10, TIME_DECIMALS)), TIME_DECIMALS);
185 if (distribution <= 0) {
186 distribution_color = '0 1 0';
190 distribution_color = '1 0 0';
193 drawstring_aspect(pos + eX * 0.75 * mySize.x, strcat(sign, distrtimer), eX * 0.25 * mySize.x + eY * (1/3) * mySize.y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
195 // race record display
196 if (distribution <= 0)
197 HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
198 drawstring_aspect(pos, timer, eX * 0.75 * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
200 } else if (!teamplay) { // non-teamgames
201 if ((spectatee_status == -1 && !autocvar__hud_configure) || autocvar_hud_panel_score_rankings)
203 HUD_Score_Rankings(pos, mySize, me);
206 // me vector := [team/connected frags id]
207 pl = players.sort_next;
211 if(autocvar__hud_configure)
214 distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
218 score = me.(scores[ps_primary]);
219 if(autocvar__hud_configure)
222 if(distribution >= 5)
223 distribution_color = eY;
224 else if(distribution >= 0)
225 distribution_color = '1 1 1';
226 else if(distribution >= -5)
227 distribution_color = '1 1 0';
229 distribution_color = eX;
231 string distribution_str;
232 distribution_str = ftos(distribution);
233 draw_beginBoldFont();
234 if (distribution >= 0)
236 if (distribution > 0)
237 distribution_str = strcat("+", distribution_str);
238 HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
240 drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize.x + eY * mySize.y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
241 drawstring_aspect(pos + eX * 0.75 * mySize.x, distribution_str, eX * 0.25 * mySize.x + eY * (1/3) * mySize.y, distribution_color, panel_fg_alpha, DRAWFLAG_NORMAL);
243 } else { // teamgames
244 float row, column, rows = 0, columns = 0;
245 vector offset = '0 0 0';
246 vector score_pos, score_size; //for scores other than myteam
247 if(autocvar_hud_panel_score_rankings)
249 HUD_Score_Rankings(pos, mySize, me);
252 if(spectatee_status == -1)
254 rows = HUD_GetRowCount(team_count, mySize, 3);
255 columns = ceil(team_count/rows);
256 score_size = eX * mySize.x*(1/columns) + eY * mySize.y*(1/rows);
259 if(score_size.x/score_size.y > 3)
261 newSize = 3 * score_size.y;
262 offset.x = score_size.x - newSize;
264 score_size.x = newSize;
268 newSize = 1/3 * score_size.x;
269 offset.y = score_size.y - newSize;
271 score_size.y = newSize;
275 score_size = eX * mySize.x*(1/4) + eY * mySize.y*(1/3);
279 draw_beginBoldFont();
281 for(tm = teams.sort_next; tm; tm = tm.sort_next) {
282 if(tm.team == NUM_SPECTATOR)
284 if(!tm.team && teamplay)
286 score = tm.(teamscores[ts_primary]);
287 if(autocvar__hud_configure)
290 if (score > max_fragcount)
291 max_fragcount = score;
293 if (spectatee_status == -1)
295 score_pos = pos + eX * column * (score_size.x + offset.x) + eY * row * (score_size.y + offset.y);
296 if (max_fragcount == score)
297 HUD_Panel_DrawHighlight(score_pos, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
298 drawstring_aspect(score_pos, ftos(score), score_size, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
306 else if(tm.team == myteam) {
307 if (max_fragcount == score)
308 HUD_Panel_DrawHighlight(pos, eX * 0.75 * mySize.x + eY * mySize.y, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
309 drawstring_aspect(pos, ftos(score), eX * 0.75 * mySize.x + eY * mySize.y, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);
311 if (max_fragcount == score)
312 HUD_Panel_DrawHighlight(pos + eX * 0.75 * mySize.x + eY * (1/3) * rows * mySize.y, score_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
313 drawstring_aspect(pos + eX * 0.75 * mySize.x + eY * (1/3) * rows * mySize.y, ftos(score), score_size, Team_ColorRGB(tm.team) * 0.8, panel_fg_alpha, DRAWFLAG_NORMAL);