home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2007 September / maximum-cd-2007-09.iso / Assets / data / AssaultCube_v0.93.exe / source / src / scoreboard.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2007-06-04  |  3.4 KB  |  107 lines

  1. #include "cube.h"
  2.  
  3. // creation of scoreboard pseudo-menu
  4.  
  5. void *scoremenu = NULL, *teammenu = NULL, *ctfmenu = NULL;
  6.  
  7. void showscores(bool on)
  8. {
  9.     menuset(on ? (m_ctf ? ctfmenu : (m_teammode ? teammenu : scoremenu)) : NULL);
  10. }
  11.  
  12. COMMAND(showscores, ARG_DOWN);
  13.  
  14. struct sline { string s; };
  15. vector<sline> scorelines;
  16.  
  17. void renderscore(void *menu, playerent *d, int cn)
  18. {
  19.     const char *status = "";
  20.     if(d->clientrole==CR_MASTER) status = "\f0";
  21.     else if(d->clientrole==CR_ADMIN) status = "\f3";
  22.     else if(d->state==CS_DEAD) status = "\f4";
  23.     s_sprintfd(lag)("%d", d->plag);
  24.     string &s = scorelines.add().s;
  25.     if(m_ctf) s_sprintf(s)("%d\t%d\t%d\t%s\t%d\t%s\t%s%s\t%d", d->flagscore, d->frags, d->lifesequence, d->state==CS_LAGGED ? "LAG" : lag, d->ping, d->team, status, colorname(d), cn);
  26.     else if(m_teammode) s_sprintf(s)("%d\t%d\t%s\t%d\t%s\t%s%s\t%d", d->frags, d->lifesequence, d->state==CS_LAGGED ? "LAG" : lag, d->ping, m_teammode ? d->team : "", status, colorname(d), cn);
  27.     else s_sprintf(s)("%d\t%d\t%s\t%d\t%s%s\t%d", d->frags, d->lifesequence, d->state==CS_LAGGED ? "LAG" : lag, d->ping, status, colorname(d), cn);
  28.     menumanual(menu, scorelines.length()-1, s);
  29. }
  30.  
  31. static int scorecmp(const playerent **x, const playerent **y)
  32. {   
  33.     if((*x)->flagscore > (*y)->flagscore) return -1;
  34.     if((*x)->flagscore < (*y)->flagscore) return 1;
  35.     if((*x)->frags > (*y)->frags) return -1;
  36.     if((*x)->frags < (*y)->frags) return 1;
  37.     return strcmp((*x)->name, (*y)->name);
  38. }
  39.  
  40. struct teamscore
  41. {
  42.     char *team;
  43.     int score, flagscore;
  44.     teamscore() {}
  45.     teamscore(char *s, int n, int f = 0) : team(s), score(n), flagscore(f) {}
  46. };
  47.  
  48. static int teamscorecmp(const teamscore *x, const teamscore *y)
  49. {
  50.     if(x->flagscore > y->flagscore) return -1;
  51.     if(x->flagscore < y->flagscore) return 1;
  52.     if(x->score > y->score) return -1;
  53.     if(x->score < y->score) return 1;
  54.     return strcmp(x->team, y->team);
  55. }
  56.  
  57. vector<teamscore> teamscores;
  58.  
  59. void addteamscore(playerent *d)
  60. {
  61.     if(!d || !d->team[0]) return;
  62.     loopv(teamscores) if(!strcmp(teamscores[i].team, d->team))
  63.     {
  64.         teamscores[i].score += d->frags;
  65.         if(m_ctf) teamscores[i].flagscore += d->flagscore;
  66.         return;
  67.     }
  68.     teamscores.add(teamscore(d->team, d->frags, m_ctf ? d->flagscore : 0));
  69. }
  70.  
  71. void renderscores(void *menu, bool init)
  72. {
  73.     scorelines.setsize(0);
  74.  
  75.     vector<playerent *> scores;
  76.     if(!demoplayback) scores.add(player1);
  77.     loopv(players) if(players[i]) scores.add(players[i]);
  78.     scores.sort(scorecmp);
  79.     loopv(scores) renderscore(menu, scores[i], scores[i]->clientnum);
  80.  
  81.     if(init)
  82.     {
  83.         int sel = scores.find(player1);
  84.         if(sel>=0) menuselect(menu, sel);
  85.     }
  86.  
  87.     if(m_teammode)
  88.     {
  89.         menumanual(menu, scorelines.length(), "");
  90.         teamscores.setsize(0);
  91.         loopv(players) addteamscore(players[i]);
  92.         if(!demoplayback) addteamscore(player1);
  93.         teamscores.sort(teamscorecmp);
  94.         string &teamline = scorelines.add().s;
  95.         teamline[0] = 0;
  96.         loopv(teamscores)
  97.         {
  98.             string s;
  99.             if(m_ctf) s_sprintf(s)("[ %s: %d flags  %d frags ]", teamscores[i].team, teamscores[i].flagscore, teamscores[i].score);
  100.             else s_sprintf(s)("[ %s: %d ]", teamscores[i].team, teamscores[i].score);
  101.             s_strcat(teamline, s);
  102.         }
  103.         menumanual(menu, scorelines.length(), teamline);
  104.     }
  105. }
  106.  
  107.