2 float sb_lines; // still don't know what to do with that NOTE: check dp's sbar.c to see what that should be
13 void Sbar_FinaleOverlay()
16 pos_x = (vid_conwidth - 1)/2;
19 drawpic(pos, "gfx/finale", '0 0', '1 1 1', sbar_alpha_fg, DRAWFLAG_NORMAL);
22 void Sbar_DrawWeapon(float nr, float fade, float active)
24 vector pos, vsize, color;
27 value = (active) ? 1 : 0.6;
28 color_x = color_y = color_z = value;
30 if(sbar_hudselector == 1)
32 // width = 300, height = 100
33 const float w_width = 32, w_height = 12, w_space = 2, font_size = 8;
35 pos_x = (vid_conwidth - w_width * 9) * 0.5 + w_width * nr;
36 pos_y = (vid_conheight - w_height);
41 drawpic(pos, strcat("gfx/inv_weapon", ftos(nr)), vsize, color, value * fade * sbar_alpha_fg, 0);
47 drawstring(pos, ftos(nr+1), vsize, '1 1 0', sbar_alpha_fg, 0);
52 // width = 300, height = 100
53 const float w2_width = 300, w2_height = 100, w2_space = 10;
54 const float w2_scale = 0.4;
56 pos_x = vid_conwidth - (w2_width + w2_space) * w2_scale;
57 pos_y = (w2_height + w2_space) * w2_scale * nr + w2_space;
59 vsize_x = w2_width * w2_scale;
60 vsize_y = w2_height * w2_scale;
63 drawpic(pos, strcat("gfx/inv_weapon", ftos(nr)), vsize, color, value * fade * sbar_alpha_fg, 0);
66 void Sbar_DrawXNum (vector pos, float num, float digits, float lettersize, vector rgb, float a, float dflags)
73 vsize_x = vsize_y = lettersize;
88 str = strcat(substring("0000000000", 0, digits - strlen(tmp)), tmp);
96 str = substring(str, l-digits, 999);
99 pos_x += (digits-l) * lettersize;
103 drawpic(sbar + pos, "gfx/num_minus", vsize, rgb, a * sbar_alpha_fg, dflags);
107 for(i = 0; i < l; ++i)
109 drawpic(sbar + pos, strcat("gfx/num_", substring(str, i, 1)), vsize, rgb, a * sbar_alpha_fg, dflags);
114 float Sbar_PlayerCmp(entity l, entity r)
118 if(l.sb_team < r.sb_team)
120 else if(l.sb_team > r.sb_team)
123 if(l.sb_frags > r.sb_frags)
125 else if(l.sb_frags < r.sb_frags)
127 return (l.sb_player > r.sb_player);
129 float Sbar_TeamCmp(entity l, entity r)
131 if(l.sb_frags > r.sb_frags)
133 else if(l.sb_frags < r.sb_frags)
135 return (l.sb_player > r.sb_player);
138 void Sbar_SortFrags()
142 entity t1, t2, t3, t4, ts;
144 Sort_Remove(sortedPlayers);
145 sortedPlayers = Sort_New(Sbar_PlayerCmp);
150 Sort_Remove(sortedTeams);
158 t1.sb_team = COLOR_TEAM1;
159 t2.sb_team = COLOR_TEAM2;
160 t3.sb_team = COLOR_TEAM3;
161 t4.sb_team = COLOR_TEAM4;
162 ts.sb_team = COLOR_SPECTATOR;
164 t1.sb_player = t2.sb_player = t3.sb_player = t4.sb_player = ts.sb_player = 0;
165 t1.sb_frags = t2.sb_frags = t3.sb_frags = t4.sb_frags = 0;
166 sortedTeams = Sort_New(Sbar_TeamCmp);
168 for(i = 0; i < maxclients; ++i)
170 if(strlen(getplayerkey(i, "name")) <= 0)
175 tmp.sb_frags = stof(getplayerkey(i, "frags"));
176 if(tmp.sb_frags == -666)
177 tmp.sb_team = COLOR_SPECTATOR;
179 tmp.sb_team = GetPlayerColor(i);
183 case COLOR_TEAM1: t1.sb_frags += tmp.sb_frags; t1.sb_player++; break;
184 case COLOR_TEAM2: t2.sb_frags += tmp.sb_frags; t2.sb_player++; break;
185 case COLOR_TEAM3: t3.sb_frags += tmp.sb_frags; t3.sb_player++; break;
186 case COLOR_TEAM4: t4.sb_frags += tmp.sb_frags; t4.sb_player++; break;
187 case COLOR_SPECTATOR: ts.sb_frags += tmp.sb_frags; ts.sb_player++; break;
190 if(i == player_localentnum-1)
191 myteam = tmp.sb_team;
193 Sort_Add(sortedPlayers, tmp);
195 if(t1.sb_player) ++numteams;
196 if(t2.sb_player) ++numteams;
197 if(t3.sb_player) ++numteams;
198 if(t4.sb_player) ++numteams;
200 Sort_Add(sortedTeams, t1);
201 Sort_Add(sortedTeams, t2);
202 Sort_Add(sortedTeams, t3);
203 Sort_Add(sortedTeams, t4);
204 Sort_Add(sortedTeams, ts);
207 for(i = 0; i < maxclients; ++i)
209 if(strlen(getplayerkey(i, "name")) <= 0)
214 tmp.sb_frags = stof(getplayerkey(i, "frags"));
215 if(tmp.sb_frags == -666)
216 tmp.sb_team = COLOR_SPECTATOR;
218 tmp.sb_team = COLOR_TEAM1;
219 Sort_Add(sortedPlayers, tmp);
224 void Sbar_PrintScoreboardItem(vector pos, entity pl, float is_self, float mask)
232 str = bufstr_get(databuf, DATABUF_PING + pl.sb_player);
233 tmp_x = 4*8 - strlen(str) * 8 - 56;
234 drawstring(pos + tmp, str, '8 8 0', '0.8 0.8 0.8', 0.8, 0);
238 str = ftos(pl.sb_frags);
239 tmp_x = 4*8 - strlen(str) * 8;
240 drawstring(pos + tmp, str, '8 8 0', '1 1 1', 1, 0);
244 drawstring(pos + '40 0 0', "\x0D", '8 8 0', '1 1 1', 1, 0);
245 str = getplayerkey(pl.sb_player, "name");
246 tmp_x = 5*8 - strlen(str) * 8 + 56;
247 drawcolorcodedstring(pos + '48 0 0', str, '8 8 0', 1, 0);
249 void Sbar_PrintScoreboardTeamItem(vector pos, entity tm, vector rgb, string name)
257 str = ftos(tm.sb_frags);
258 tmp_x = 4*8 - strlen(str) * 8;
259 drawstring(pos + tmp, str, '8 8 0', '1 1 1', 1, 0);
261 rgb += '0.3 0.3 0.3';
262 rgb = normalize(rgb * 5);
263 drawstring(pos + '48 0 0', name, '8 8 0', rgb, 1, 0);
266 void Sbar_DrawScoreboard()
268 // Assume: frags are already sorted
269 float xmin, xmax, ymin, ymax, plcount;
270 vector pos, teammin, teammax, rgb;
275 xmin = vid_conwidth / 4;
276 xmax = vid_conwidth - xmin;
278 ymax = vid_conheight - 50;
283 teammin = teammax = '0 0 0';
284 teammin_x = xmin - 2;
285 teammax_x = xmax - 2;
287 pos_x = 0.5 * (xmin + xmax) - (24*5);
288 drawfont = FONT_USER+0;
289 drawstring(pos, "Scoreboard", '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
294 drawstring(pos, "ping", '8 8 0', '1 1 1', 1, 0);
295 drawstring(pos + '48 0 0', "frags", '8 8 0', '1 1 1', 1, 0);
296 drawstring(pos + '104 0 0', "name", '8 8 0', '1 1 1', 1, 0);
302 teampos_y = pos_y - 40;
303 teampos_x = (vid_conwidth * 0.5) - (numteams*6*12);*/
304 for(tm = sortedTeams.sort_next; tm; tm = tm.sort_next)
306 if(!tm.sb_player || tm.sb_team == COLOR_SPECTATOR) // no players in it?
309 //Sbar_DrawXNum(teampos-sbar, tm.sb_frags, -4, 24, GetTeamRGB(tm.sb_team), 1, DRAWFLAG_NORMAL);
311 Sbar_DrawXNum(pos-'106 0 0'-sbar, tm.sb_frags, 4, 24, GetTeamRGB(tm.sb_team), 1, DRAWFLAG_NORMAL);
313 teammin_y = pos_y - 2;
314 teammax_y = pos_y + 2 + 10 * (tm.sb_player);
315 rgb = GetTeamRGB(tm.sb_team);
316 drawfill(teammin, teammax - teammin, rgb, 0.2, DRAWFLAG_NORMAL);
317 /*Sbar_PrintScoreboardTeamItem(pos, tm, rgb, GetTeamName(tm.sb_team));
319 //for(i = 0; i < maxclients; ++i)
321 for(pl = sortedPlayers.sort_next; pl; pl = pl.sort_next)
323 if(pl.sb_team != tm.sb_team)
325 Sbar_PrintScoreboardItem(pos, pl, (pl.sb_player == player_localentnum - 1), 0);
334 // rgb := tempvector :)
335 rgb = pos + '0 12 0';
338 //for(i = 0; i < maxclients; ++i)
339 for(pl = sortedPlayers.sort_next; pl; pl = pl.sort_next)
341 if(pl.sb_team != COLOR_SPECTATOR)
343 //drawcolorcodedstring(pos, getplayerkey(pl.sb_player, "name"), '8 8 0', 1, 0);
344 Sbar_PrintScoreboardItem(pos, pl, (pl.sb_player == player_localentnum - 1), 1);
350 drawstring(rgb, "Spectators", '8 8 0', '1 1 1', 1, 0);
352 //for(i = 0; i < maxclients; ++i)
353 for(pl = sortedPlayers.sort_next; pl; pl = pl.sort_next)
355 if(pl.sb_team != COLOR_TEAM1)
357 //drawstring(pos, ftos(pl.sb_frags), '8 8 0', '1 1 1', 1, 0);
358 //drawcolorcodedstring(pos + '64 0 0', getplayerkey(pl.sb_player, "name"), '8 8 0', 1, 0);
359 Sbar_PrintScoreboardItem(pos, pl, (pl.sb_player == player_localentnum - 1), 0);
362 rgb = pos + '0 12 0';
365 for(pl = sortedPlayers.sort_next; pl; pl = pl.sort_next)
367 if(pl.sb_team != COLOR_SPECTATOR)
370 //drawcolorcodedstring(pos, getplayerkey(pl.sb_player, "name"), '8 8 0', 1, 0);
371 Sbar_PrintScoreboardItem(pos, pl, (pl.sb_player == player_localentnum - 1), 1);
375 drawstring(rgb, "Spectators", '8 8 0', '1 1 1', 1, 0);
380 void Sbar_Score(float margin)
382 float timelimit, timeleft, minutes, seconds, distribution, myplace;
383 vector sbar_save, place;
387 sbar_y = vid_conheight - (32+12);
398 //for(i = 0; i < 4; ++i)
399 for(tm = sortedTeams.sort_next; tm; tm = tm.sort_next)
401 if(tm.sb_team == COLOR_SPECTATOR || !tm.sb_player) // no players? don't display
404 if(tm.sb_team == myteam)
405 Sbar_DrawXNum('-128 0', tm.sb_frags, 4, 32, GetTeamRGB(tm.sb_team), 1, DRAWFLAG_NORMAL);
408 Sbar_DrawXNum(place, tm.sb_frags, 4, 12, GetTeamRGB(tm.sb_team), 1, DRAWFLAG_NORMAL);
413 // me vector := [team/connected frags id]
415 for(me = sortedPlayers.sort_next; me; me = me.sort_next)
417 if(me.sb_team != COLOR_SPECTATOR)
419 if(me.sb_player == player_localentnum - 1)
422 pl = sortedPlayers.sort_next;
426 if(pl && myplace != 1)
428 distribution = me.sb_frags - pl.sb_frags;
430 distribution = me.sb_frags - pl.sb_frags;
435 Sbar_DrawXNum('-36 -12', myplace, 3, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
436 else if(myplace == 2)
437 Sbar_DrawXNum('-36 -12', myplace, 3, 12, '1 1 0', 1, DRAWFLAG_NORMAL);
439 Sbar_DrawXNum('-36 -12', myplace, 3, 12, '1 0 0', 1, DRAWFLAG_NORMAL);
441 if(distribution >= 0)
443 Sbar_DrawXNum('-84 -12', distribution, 4, 12, ' 1 1 1', 1, DRAWFLAG_NORMAL);
444 Sbar_DrawXNum('-128 0', me.sb_frags, 4, 32, '1 1 1', 1, DRAWFLAG_NORMAL);
445 } else if(distribution >= -5)
447 Sbar_DrawXNum('-84 -12', distribution, 4, 12, ' 1 1 0', 1, DRAWFLAG_NORMAL);
448 Sbar_DrawXNum('-128 0', me.sb_frags, 4, 32, '1 1 0', 1, DRAWFLAG_NORMAL);
450 Sbar_DrawXNum('-84 -12', distribution, 4, 12, ' 1 0 0', 1, DRAWFLAG_NORMAL);
451 Sbar_DrawXNum('-128 0', me.sb_frags, 4, 32, '1 0 0', 1, DRAWFLAG_NORMAL);
454 timelimit = getstatf(STAT_TIMELIMIT);
457 timeleft = max(0, timelimit * 60 - time);
458 minutes = floor(timeleft / 60);
459 seconds = floor(timeleft - minutes*60);
462 Sbar_DrawXNum('-72 32', minutes, 3, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
463 drawpic(sbar + '-36 32', "gfx/num_colon", '12 12', '1 1 1', sbar_alpha_fg, 0);
464 Sbar_DrawXNum('-24 32', seconds, -2, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
465 } else if(minutes >= 1)
467 Sbar_DrawXNum('-72 32', minutes, 3, 12, '1 1 0', 1, DRAWFLAG_NORMAL);
468 drawpic(sbar + '-36 32', "gfx/num_colon", '12 12', '1 1 0', sbar_alpha_fg, 0);
469 Sbar_DrawXNum('-24 32', seconds, -2, 12, '1 1 0', 1, DRAWFLAG_NORMAL);
471 Sbar_DrawXNum('-24 32', seconds, -2, 12, '1 0 0', 1, DRAWFLAG_NORMAL);
474 minutes = floor(time / 60);
475 seconds = floor(time - minutes*60);
476 Sbar_DrawXNum('-72 32', minutes, 3, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
477 drawpic(sbar + '-36 32', "gfx/num_colon", '12 12', '1 1 1', sbar_alpha_fg, 0);
478 Sbar_DrawXNum('-24 32', seconds, -2, 12, '1 1 1', 1, DRAWFLAG_NORMAL);
483 void Sbar_MiniscoreItem(vector pos, entity pl, float is_self)
489 drawfill(pos + '0 1 0', '40 6 0', GetTeamRGB(pl.sb_team)*0.5, 1, DRAWFLAG_NORMAL);
491 drawfill(pos + '0 1 0', '40 6 0', '0.5 0.5 0.5', 0.5, DRAWFLAG_NORMAL);
494 pos_x -= strlen(ftos(pl.sb_frags))*8;
495 drawstring(pos, ftos(pl.sb_frags), '8 8 0', '1 1 1', 1, DRAWFLAG_NORMAL);
500 drawstring(pos, "\x0D", '8 8 0', '1 1 1', 1, DRAWFLAG_NORMAL);
504 drawcolorcodedstring(pos, getplayerkey(pl.sb_player, "name"), '8 8 0', 1, 0);
507 void Sbar_MiniscoreTeamItem(vector pos, float color, float frags, float is_self)
513 drawfill(pos + '0 1 0', '40 6 0', GetTeamRGB(color)*0.5, 1, DRAWFLAG_NORMAL);
515 drawfill(pos + '0 1 0', '40 6 0', '0.5 0.5 0.5', 0.5, DRAWFLAG_NORMAL);
518 pos_x -= strlen(ftos(frags))*8;
519 drawstring(pos, ftos(frags), '8 8 0', '1 1 1', 1, DRAWFLAG_NORMAL);
524 drawstring(pos, "\x0D", '8 8 0', '1 1 1', 1, DRAWFLAG_NORMAL);
528 drawstring(pos, GetTeamName(color), '8 8 0', '1 1 1', 1, DRAWFLAG_NORMAL);
531 void Sbar_MiniDeathmatchOverlay(vector pos)
533 float numlines, up, down;
535 float miniscoreboard_size;
536 miniscoreboard_size = cvar("sbar_miniscoreboard_size");
538 if(miniscoreboard_size == 0)
540 pos_y = vid_conheight - 8;
542 if(miniscoreboard_size < 0)
543 numlines = (vid_conheight - sbar_y + 7) / 8;
545 numlines = miniscoreboard_size;
547 // give up if there isn't enough room
548 if(pos_x >= vid_conwidth || pos_y >= vid_conheight || numlines < 1)
551 // me vector := [team/connected frags id]
552 for(me = sortedPlayers.sort_next; me; me = me.sort_next)
554 if(me.sb_player == player_localentnum - 1)
559 numlines -= numteams;
561 // figure out how many players above and below we can show
562 up = floor(numlines/2);
564 if((up + down) > numlines)
565 down = numlines - up;
568 for(pl = me.sort_next; pl && down > 0; pl = pl.sort_next)
570 if(pl.sb_team == COLOR_SPECTATOR)
572 Sbar_MiniscoreItem(pos, pl, false);
576 Sbar_MiniscoreItem(pos, me, true);
578 up += down; // if there weren't enough lines below... add them
579 for(pl = me.sort_prev; pl != sortedPlayers && up > 0; pl = pl.sort_prev)
581 if(pl.sb_team == COLOR_SPECTATOR)
583 Sbar_MiniscoreItem(pos, pl, false);
590 for(tm = sortedTeams.sort_next; tm.sort_next; tm = tm.sort_next);
591 for(; tm != sortedTeams; tm = tm.sort_prev)
593 if(!tm.sb_player || tm.sb_team == COLOR_SPECTATOR) // no players?
595 Sbar_MiniscoreTeamItem(pos, tm.sb_team, tm.sb_frags, (tm.sb_team == me.sb_team));
601 void Sbar_Draw (void)
612 Sbar_DrawScoreboard();
613 else if (intermission == 1)
615 Sbar_DrawScoreboard();
618 else if (intermission == 2)
619 Sbar_FinaleOverlay();
622 if (sb_showscores || (getstati(STAT_HEALTH) <= 0 && cvar("cl_deathscoreboard")))
624 sbar_x = (vid_conwidth - 640.0)*0.5;
625 sbar_y = vid_conheight - 47;
626 //Sbar_DrawAlphaPic (sbar_x, sbar_y, sb_scorebar, sbar_alpha_bg.value);
627 //drawpic('0 0', "gfx/scorebar", '0 0 0', '1 1 1', cvar("sbar_alpha_bg"), 0);
628 Sbar_DrawScoreboard ();
632 if (sb_lines && sbar_hudselector == 1)
634 stat_items = getstati(STAT_ITEMS);
636 sbar_x = (vid_conwidth - 320.0)*0.5;
637 sbar_y = vid_conheight - 24.0 - 16.0;
640 fade = 3.2 - 2 * (time - weapontime);
641 fade = bound(0.7, fade, 1);
644 for(i = 0; i < 8; ++i)
648 Sbar_DrawWeapon(i+1, fade, (i + 2 == activeweapon));
655 Sbar_DrawWeapon(0, fade, (activeweapon == 1));
659 x = getstati(STAT_ARMOR);
663 //Sbar_DrawStretchPic (72, 0, sb_armor[0], sbar_alpha_fg.value, 24, 24);
664 drawpic(sbar + '72 0', "gfx/sb_armor", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
666 Sbar_DrawXNum('0 0', x, 3, 24, '0 1 0', 1, 0);
668 Sbar_DrawXNum('0 0', x, 3, 24, '0.2 1 0', 1, 0);
670 Sbar_DrawXNum('0 0', x, 3, 24, '0.6 0.7 0.8', 1, 0);
672 Sbar_DrawXNum('0 0', x, 3, 24, '1 1 0.2', 1, 0);
674 Sbar_DrawXNum('0 0', x, 3, 24, '0.7 0 0', 1, 0);
678 x = getstati(STAT_HEALTH);
682 //Sbar_DrawStretchPic (184, 0, sb_health, sbar_alpha_fg.value, 24, 24);
683 drawpic(sbar + '184 0', "gfx/sb_health", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
685 Sbar_DrawXNum('112 0', x, 3, 24, '0 1 0', 1, 0);
687 Sbar_DrawXNum('112 0', x, 3, 24, '0.2 1 0', 1, 0);
689 Sbar_DrawXNum('112 0', x, 3, 24, '0.6 0.7 0.8', 1, 0);
691 Sbar_DrawXNum('112 0', x, 3, 24, '1 1 0.2', 1, 0);
693 Sbar_DrawXNum('112 0', x, 3, 24, '0.7 0 0', 1, 0);
697 x = getstati(STAT_AMMO);
698 if ((stat_items & (NEX_IT_SHELLS | NEX_IT_BULLETS | NEX_IT_ROCKETS | NEX_IT_CELLS)) || x != 0)
700 if (stat_items & NEX_IT_SHELLS)
701 drawpic(sbar + '296 0', "gfx/sb_shells", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
702 else if (stat_items & NEX_IT_BULLETS)
703 drawpic(sbar + '296 0', "gfx/sb_bullets", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
704 else if (stat_items & NEX_IT_ROCKETS)
705 drawpic(sbar + '296 0', "gfx/sb_rocket", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
706 else if (stat_items & NEX_IT_CELLS)
707 drawpic(sbar + '296 0', "gfx/sb_cells", '24 24 0', '1 1 1', sbar_alpha_fg, 0);
709 Sbar_DrawXNum('224 0', x, 3, 24, '0.6 0.7 0.8', 1, 0);
711 Sbar_DrawXNum('224 0', x, 3, 24, '0.7 0 0', 1, 0);
714 if (sbar_x + 320 + 160 <= vid_conwidth)
715 Sbar_MiniDeathmatchOverlay(sbar + '320 0');
718 // The margin can be at most 8 to support 640x480 console size:
719 // 320 + 2 * (144 + 16) = 640
724 stat_items = getstati(STAT_ITEMS);
726 sbar_x = (vid_conwidth - 640.0)*0.5;
727 sbar_y = vid_conheight - 47;
730 fade = 3 - 2 * (time - weapontime);
733 for(i = 0; i < 8; ++i)
737 Sbar_DrawWeapon(i+1, fade, (i + 2 == activeweapon));
744 Sbar_DrawWeapon(0, fade, (activeweapon == 1));
748 drawpic(sbar, "gfx/sbar", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
750 drawpic(sbar, "gfx/sbar_minimal", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
754 Sbar_DrawXNum('268 12', getstati(STAT_ARMOR), 3, 24, '0.6 0.7 0.8', 1, 0);
758 x = getstati(STAT_HEALTH);
760 Sbar_DrawXNum('82 12', x, 3, 24, '1 1 1', 1, 0);
761 else if(x <= 25 && time - floor(time) > 0.5)
762 Sbar_DrawXNum('82 12', x, 3, 24, '0.7 0 0', 1, 0);
764 Sbar_DrawXNum('81 12', x, 3, 24, '0.6 0.7 0.8', 1, 0);
766 // AK dont draw ammo for the laser
767 x = getstati(STAT_AMMO);
768 if(activeweapon != 12)
771 if (stat_items & NEX_IT_SHELLS)
772 drawpic(sbar + '519 0', "gfx/sb_shells", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
773 else if (stat_items & NEX_IT_BULLETS)
774 drawpic(sbar + '519 0', "gfx/sb_bullets", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
775 else if (stat_items & NEX_IT_ROCKETS)
776 drawpic(sbar + '519 0', "gfx/sb_rocket", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
777 else if (stat_items & NEX_IT_CELLS)
778 drawpic(sbar + '519 0', "gfx/sb_cells", '0 0 0', '1 1 1', sbar_alpha_fg, 0);
780 Sbar_DrawXNum('447 12', x, 3, 24, '0.6 0.7 0.8', 1, 0);
782 Sbar_DrawXNum('447 12', x, 3, 24, '0.7 0 0', 1, 0);
786 drawpic(sbar, "gfx/sbar_overlay", '0 0 0', '1 1 1', 1, DRAWFLAG_MODULATE);
788 if (sbar_x + 600 + 160 <= vid_conwidth)
789 Sbar_MiniDeathmatchOverlay (sbar + '600 0');
794 // Mini scoreboard uses 12*4 per other team, that is, 144
795 // pixels when there are four teams...
796 // Nexuiz by default sets vid_conwidth to 800... makes
798 // so we need to shift it by 64 pixels to the right to fit
799 // BUT: then it overlaps with the image that gets drawn
800 // for viewsize 100! Therefore, just account for 3 teams,
801 // that is, 96 pixels mini scoreboard size, needing 16 pixels
806 if(gametype == GAME_KEYHUNT)
809 } else if(gametype == GAME_CTF)
817 void CSQC_ctf_hud(void)
819 // cvar("sbar_flagstatus_right") move the flag icons right
820 // cvar("sbar_flagstatus_pos") pixel position of the nexuiz flagstatus icons
821 float redflag, blueflag;
825 stat_items = getstati(STAT_ITEMS);
826 redflag = (stat_items/32768) & 3;
827 blueflag = (stat_items/131072) & 3;
829 pos_x = (cvar("sbar_flagstatus_right")) ? vid_conwidth - 10 - sbar_x - 64 : 10 - sbar_x;
832 if(sbar_hudselector == 1)
833 pos_y = (vid_conheight - sbar_y) - cvar("sbar_flagstatus_pos") - 64;
841 case 1: drawpic(pos, "gfx/sb_flag_red_taken", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
842 case 2: drawpic(pos, "gfx/sb_flag_red_lost", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
843 case 3: drawpic(pos, "gfx/sb_flag_red_carrying", '0 0 0', '1 1 1', 1, DRAWFLAG_NORMAL); break;
850 case 1: drawpic(pos, "gfx/sb_flag_blue_taken", '0 0 0', '1 1 1', 1, 0); break;
851 case 2: drawpic(pos, "gfx/sb_flag_blue_lost", '0 0 0', '1 1 1', 1, 0); break;
852 case 3: drawpic(pos, "gfx/sb_flag_blue_carrying", '0 0 0', '1 1 1', 1, 0); break;