+static int Sbar_TeamColorCompare(const void *t1_, const void *t2_)
+{
+ static int const sortorder[16] =
+ {
+ 1001,
+ 1002,
+ 1003,
+ 1004,
+ 1, // red
+ 1005,
+ 1006,
+ 1007,
+ 1008,
+ 4, // pink
+ 1009,
+ 1010,
+ 3, // yellow
+ 2, // blue
+ 1011,
+ 1012
+ };
+ const scoreboard_t *t1 = *(scoreboard_t **) t1_;
+ const scoreboard_t *t2 = *(scoreboard_t **) t2_;
+ int tc1 = sortorder[t1->colors & 15];
+ int tc2 = sortorder[t2->colors & 15];
+ return tc1 - tc2;
+}
+
+void Sbar_Score (int margin)
+{
+ int i, me, score, otherleader, place, distribution, minutes, seconds;
+ double timeleft;
+ int sbar_x_save = sbar_x;
+ int sbar_y_save = sbar_y;
+
+
+ sbar_y = (int) (vid_conheight.value - (32+12));
+ sbar_x -= margin;
+
+ me = cl.playerentity - 1;
+ if (sbar_scorerank.integer && me >= 0 && me < cl.maxclients)
+ {
+ if(Sbar_IsTeammatch())
+ {
+ // Layout:
+ //
+ // team1 team3 team4
+ //
+ // TEAM2
+
+ scoreboard_t *teamcolorsort[16];
+
+ Sbar_SortFrags();
+ for(i = 0; i < teamlines; ++i)
+ teamcolorsort[i] = &(teams[i]);
+
+ // Now sort them by color
+ qsort(teamcolorsort, teamlines, sizeof(*teamcolorsort), Sbar_TeamColorCompare);
+
+ // : margin
+ // -12*4: four digits space
+ place = (teamlines - 1) * (-12 * 4);
+
+ for(i = 0; i < teamlines; ++i)
+ {
+ int cindex = teamcolorsort[i]->colors & 15;
+ unsigned char *c = palette_rgb_shirtscoreboard[cindex];
+ float cm = max(max(c[0], c[1]), c[2]);
+ float cr = c[0] / cm;
+ float cg = c[1] / cm;
+ float cb = c[2] / cm;
+ if(cindex == (cl.scores[cl.playerentity - 1].colors & 15)) // my team
+ {
+ Sbar_DrawXNum(-32*4, 0, teamcolorsort[i]->frags, 4, 32, cr, cg, cb, 1, 0);
+ }
+ else // other team
+ {
+ Sbar_DrawXNum(place, -12, teamcolorsort[i]->frags, 4, 12, cr, cg, cb, 1, 0);
+ place += 4 * 12;
+ }
+ }
+ }
+ else
+ {
+ // Layout:
+ //
+ // leading place
+ //
+ // FRAGS
+ //
+ // find leading score other than ourselves, to calculate distribution
+ // find our place in the scoreboard
+ score = cl.scores[me].frags;
+ for (i = 0, otherleader = -1, place = 1;i < cl.maxclients;i++)
+ {
+ if (cl.scores[i].name[0] && i != me)
+ {
+ if (otherleader == -1 || cl.scores[i].frags > cl.scores[otherleader].frags)
+ otherleader = i;
+ if (score < cl.scores[i].frags || (score == cl.scores[i].frags && i < me))
+ place++;
+ }
+ }
+ distribution = otherleader >= 0 ? score - cl.scores[otherleader].frags : 0;
+ if (place == 1)
+ Sbar_DrawXNum(-3*12, -12, place, 3, 12, 1, 1, 1, 1, 0);
+ else if (place == 2)
+ Sbar_DrawXNum(-3*12, -12, place, 3, 12, 1, 1, 0, 1, 0);
+ else
+ Sbar_DrawXNum(-3*12, -12, place, 3, 12, 1, 0, 0, 1, 0);
+ if (otherleader < 0)
+ Sbar_DrawXNum(-32*4, 0, score, 4, 32, 1, 1, 1, 1, 0);
+ if (distribution >= 0)
+ {
+ Sbar_DrawXNum(-7*12, -12, distribution, 4, 12, 1, 1, 1, 1, 0);
+ Sbar_DrawXNum(-32*4, 0, score, 4, 32, 1, 1, 1, 1, 0);
+ }
+ else if (distribution >= -5)
+ {
+ Sbar_DrawXNum(-7*12, -12, distribution, 4, 12, 1, 1, 0, 1, 0);
+ Sbar_DrawXNum(-32*4, 0, score, 4, 32, 1, 1, 0, 1, 0);
+ }
+ else
+ {
+ Sbar_DrawXNum(-7*12, -12, distribution, 4, 12, 1, 0, 0, 1, 0);
+ Sbar_DrawXNum(-32*4, 0, score, 4, 32, 1, 0, 0, 1, 0);
+ }
+ }
+ }
+
+ if (sbar_gametime.integer && cl.statsf[STAT_TIMELIMIT])
+ {
+ timeleft = max(0, cl.statsf[STAT_TIMELIMIT] * 60 - cl.time);
+ minutes = (int)floor(timeleft / 60);
+ seconds = (int)(floor(timeleft) - minutes * 60);
+ if (minutes >= 5)
+ {
+ Sbar_DrawXNum(-12*6, 32, minutes, 3, 12, 1, 1, 1, 1, 0);
+ if(sb_colon && sb_colon->tex != r_texture_notexture)
+ DrawQ_Pic(sbar_x + -12*3, sbar_y + 32, sb_colon, 12, 12, 1, 1, 1, sbar_alpha_fg.value, 0);
+ Sbar_DrawXNum(-12*2, 32, seconds, -2, 12, 1, 1, 1, 1, 0);
+ }
+ else if (minutes >= 1)
+ {
+ Sbar_DrawXNum(-12*6, 32, minutes, 3, 12, 1, 1, 0, 1, 0);
+ if(sb_colon && sb_colon->tex != r_texture_notexture)
+ DrawQ_Pic(sbar_x + -12*3, sbar_y + 32, sb_colon, 12, 12, 1, 1, 0, sbar_alpha_fg.value, 0);
+ Sbar_DrawXNum(-12*2, 32, seconds, -2, 12, 1, 1, 0, 1, 0);
+ }
+ else if ((int)(timeleft * 4) & 1)
+ Sbar_DrawXNum(-12*2, 32, seconds, -2, 12, 1, 1, 1, 1, 0);
+ else
+ Sbar_DrawXNum(-12*2, 32, seconds, -2, 12, 1, 0, 0, 1, 0);
+ }
+ else if (sbar_gametime.integer)
+ {
+ minutes = (int)floor(cl.time / 60);
+ seconds = (int)(floor(cl.time) - minutes * 60);
+ Sbar_DrawXNum(-12*6, 32, minutes, 3, 12, 1, 1, 1, 1, 0);
+ if(sb_colon && sb_colon->tex != r_texture_notexture)
+ DrawQ_Pic(sbar_x + -12*3, sbar_y + 32, sb_colon, 12, 12, 1, 1, 1, sbar_alpha_fg.value, 0);
+ Sbar_DrawXNum(-12*2, 32, seconds, -2, 12, 1, 1, 1, 1, 0);
+ }
+
+ sbar_x = sbar_x_save;
+ sbar_y = sbar_y_save;
+}
+