Annotation of quakeworld/client/sbar.c, revision 1.1.1.1

1.1       root        1: /*
                      2: Copyright (C) 1996-1997 Id Software, Inc.
                      3: 
                      4: This program is free software; you can redistribute it and/or
                      5: modify it under the terms of the GNU General Public License
                      6: as published by the Free Software Foundation; either version 2
                      7: of the License, or (at your option) any later version.
                      8: 
                      9: This program is distributed in the hope that it will be useful,
                     10: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
                     12: 
                     13: See the GNU General Public License for more details.
                     14: 
                     15: You should have received a copy of the GNU General Public License
                     16: along with this program; if not, write to the Free Software
                     17: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
                     18: 
                     19: */
                     20: // sbar.c -- status bar code
                     21: 
                     22: #include "quakedef.h"
                     23: 
                     24: 
                     25: int                    sb_updates;             // if >= vid.numpages, no update needed
                     26: 
                     27: #define STAT_MINUS             10      // num frame for '-' stats digit
                     28: qpic_t         *sb_nums[2][11];
                     29: qpic_t         *sb_colon, *sb_slash;
                     30: qpic_t         *sb_ibar;
                     31: qpic_t         *sb_sbar;
                     32: qpic_t         *sb_scorebar;
                     33: 
                     34: qpic_t         *sb_weapons[7][8];      // 0 is active, 1 is owned, 2-5 are flashes
                     35: qpic_t         *sb_ammo[4];
                     36: qpic_t         *sb_sigil[4];
                     37: qpic_t         *sb_armor[3];
                     38: qpic_t         *sb_items[32];
                     39: 
                     40: qpic_t *sb_faces[7][2];                // 0 is gibbed, 1 is dead, 2-6 are alive
                     41:                                                        // 0 is static, 1 is temporary animation
                     42: qpic_t *sb_face_invis;
                     43: qpic_t *sb_face_quad;
                     44: qpic_t *sb_face_invuln;
                     45: qpic_t *sb_face_invis_invuln;
                     46: 
                     47: qboolean       sb_showscores;
                     48: qboolean       sb_showteamscores;
                     49: 
                     50: int                    sb_lines;                       // scan lines to draw
                     51: 
                     52: void Sbar_DeathmatchOverlay (int start);
                     53: void Sbar_TeamOverlay (void);
                     54: void Sbar_MiniDeathmatchOverlay (void);
                     55: 
                     56: static qboolean largegame = false;
                     57: 
                     58: /*
                     59: ===============
                     60: Sbar_ShowTeamScores
                     61: 
                     62: Tab key down
                     63: ===============
                     64: */
                     65: void Sbar_ShowTeamScores (void)
                     66: {
                     67:        if (sb_showteamscores)
                     68:                return;
                     69: 
                     70:        sb_showteamscores = true;
                     71:        sb_updates = 0;
                     72: }
                     73: 
                     74: /*
                     75: ===============
                     76: Sbar_DontShowTeamScores
                     77: 
                     78: Tab key up
                     79: ===============
                     80: */
                     81: void Sbar_DontShowTeamScores (void)
                     82: {
                     83:        sb_showteamscores = false;
                     84:        sb_updates = 0;
                     85: }
                     86: 
                     87: /*
                     88: ===============
                     89: Sbar_ShowScores
                     90: 
                     91: Tab key down
                     92: ===============
                     93: */
                     94: void Sbar_ShowScores (void)
                     95: {
                     96:        if (sb_showscores)
                     97:                return;
                     98: 
                     99:        sb_showscores = true;
                    100:        sb_updates = 0;
                    101: }
                    102: 
                    103: /*
                    104: ===============
                    105: Sbar_DontShowScores
                    106: 
                    107: Tab key up
                    108: ===============
                    109: */
                    110: void Sbar_DontShowScores (void)
                    111: {
                    112:        sb_showscores = false;
                    113:        sb_updates = 0;
                    114: }
                    115: 
                    116: /*
                    117: ===============
                    118: Sbar_Changed
                    119: ===============
                    120: */
                    121: void Sbar_Changed (void)
                    122: {
                    123:        sb_updates = 0; // update next frame
                    124: }
                    125: 
                    126: /*
                    127: ===============
                    128: Sbar_Init
                    129: ===============
                    130: */
                    131: void Sbar_Init (void)
                    132: {
                    133:        int             i;
                    134: 
                    135:        for (i=0 ; i<10 ; i++)
                    136:        {
                    137:                sb_nums[0][i] = Draw_PicFromWad (va("num_%i",i));
                    138:                sb_nums[1][i] = Draw_PicFromWad (va("anum_%i",i));
                    139:        }
                    140: 
                    141:        sb_nums[0][10] = Draw_PicFromWad ("num_minus");
                    142:        sb_nums[1][10] = Draw_PicFromWad ("anum_minus");
                    143: 
                    144:        sb_colon = Draw_PicFromWad ("num_colon");
                    145:        sb_slash = Draw_PicFromWad ("num_slash");
                    146: 
                    147:        sb_weapons[0][0] = Draw_PicFromWad ("inv_shotgun");
                    148:        sb_weapons[0][1] = Draw_PicFromWad ("inv_sshotgun");
                    149:        sb_weapons[0][2] = Draw_PicFromWad ("inv_nailgun");
                    150:        sb_weapons[0][3] = Draw_PicFromWad ("inv_snailgun");
                    151:        sb_weapons[0][4] = Draw_PicFromWad ("inv_rlaunch");
                    152:        sb_weapons[0][5] = Draw_PicFromWad ("inv_srlaunch");
                    153:        sb_weapons[0][6] = Draw_PicFromWad ("inv_lightng");
                    154:        
                    155:        sb_weapons[1][0] = Draw_PicFromWad ("inv2_shotgun");
                    156:        sb_weapons[1][1] = Draw_PicFromWad ("inv2_sshotgun");
                    157:        sb_weapons[1][2] = Draw_PicFromWad ("inv2_nailgun");
                    158:        sb_weapons[1][3] = Draw_PicFromWad ("inv2_snailgun");
                    159:        sb_weapons[1][4] = Draw_PicFromWad ("inv2_rlaunch");
                    160:        sb_weapons[1][5] = Draw_PicFromWad ("inv2_srlaunch");
                    161:        sb_weapons[1][6] = Draw_PicFromWad ("inv2_lightng");
                    162:        
                    163:        for (i=0 ; i<5 ; i++)
                    164:        {
                    165:                sb_weapons[2+i][0] = Draw_PicFromWad (va("inva%i_shotgun",i+1));
                    166:                sb_weapons[2+i][1] = Draw_PicFromWad (va("inva%i_sshotgun",i+1));
                    167:                sb_weapons[2+i][2] = Draw_PicFromWad (va("inva%i_nailgun",i+1));
                    168:                sb_weapons[2+i][3] = Draw_PicFromWad (va("inva%i_snailgun",i+1));
                    169:                sb_weapons[2+i][4] = Draw_PicFromWad (va("inva%i_rlaunch",i+1));
                    170:                sb_weapons[2+i][5] = Draw_PicFromWad (va("inva%i_srlaunch",i+1));
                    171:                sb_weapons[2+i][6] = Draw_PicFromWad (va("inva%i_lightng",i+1));
                    172:        }
                    173: 
                    174:        sb_ammo[0] = Draw_PicFromWad ("sb_shells");
                    175:        sb_ammo[1] = Draw_PicFromWad ("sb_nails");
                    176:        sb_ammo[2] = Draw_PicFromWad ("sb_rocket");
                    177:        sb_ammo[3] = Draw_PicFromWad ("sb_cells");
                    178: 
                    179:        sb_armor[0] = Draw_PicFromWad ("sb_armor1");
                    180:        sb_armor[1] = Draw_PicFromWad ("sb_armor2");
                    181:        sb_armor[2] = Draw_PicFromWad ("sb_armor3");
                    182: 
                    183:        sb_items[0] = Draw_PicFromWad ("sb_key1");
                    184:        sb_items[1] = Draw_PicFromWad ("sb_key2");
                    185:        sb_items[2] = Draw_PicFromWad ("sb_invis");
                    186:        sb_items[3] = Draw_PicFromWad ("sb_invuln");
                    187:        sb_items[4] = Draw_PicFromWad ("sb_suit");
                    188:        sb_items[5] = Draw_PicFromWad ("sb_quad");
                    189: 
                    190:        sb_sigil[0] = Draw_PicFromWad ("sb_sigil1");
                    191:        sb_sigil[1] = Draw_PicFromWad ("sb_sigil2");
                    192:        sb_sigil[2] = Draw_PicFromWad ("sb_sigil3");
                    193:        sb_sigil[3] = Draw_PicFromWad ("sb_sigil4");
                    194: 
                    195:        sb_faces[4][0] = Draw_PicFromWad ("face1");
                    196:        sb_faces[4][1] = Draw_PicFromWad ("face_p1");
                    197:        sb_faces[3][0] = Draw_PicFromWad ("face2");
                    198:        sb_faces[3][1] = Draw_PicFromWad ("face_p2");
                    199:        sb_faces[2][0] = Draw_PicFromWad ("face3");
                    200:        sb_faces[2][1] = Draw_PicFromWad ("face_p3");
                    201:        sb_faces[1][0] = Draw_PicFromWad ("face4");
                    202:        sb_faces[1][1] = Draw_PicFromWad ("face_p4");
                    203:        sb_faces[0][0] = Draw_PicFromWad ("face5");
                    204:        sb_faces[0][1] = Draw_PicFromWad ("face_p5");
                    205: 
                    206:        sb_face_invis = Draw_PicFromWad ("face_invis");
                    207:        sb_face_invuln = Draw_PicFromWad ("face_invul2");
                    208:        sb_face_invis_invuln = Draw_PicFromWad ("face_inv2");
                    209:        sb_face_quad = Draw_PicFromWad ("face_quad");
                    210: 
                    211:        Cmd_AddCommand ("+showscores", Sbar_ShowScores);
                    212:        Cmd_AddCommand ("-showscores", Sbar_DontShowScores);
                    213:                
                    214:        Cmd_AddCommand ("+showteamscores", Sbar_ShowTeamScores);
                    215:        Cmd_AddCommand ("-showteamscores", Sbar_DontShowTeamScores);
                    216:                
                    217:        sb_sbar = Draw_PicFromWad ("sbar");
                    218:        sb_ibar = Draw_PicFromWad ("ibar");
                    219:        sb_scorebar = Draw_PicFromWad ("scorebar");
                    220: }
                    221: 
                    222: 
                    223: //=============================================================================
                    224: 
                    225: // drawing routines are reletive to the status bar location
                    226: 
                    227: /*
                    228: =============
                    229: Sbar_DrawPic
                    230: =============
                    231: */
                    232: void Sbar_DrawPic (int x, int y, qpic_t *pic)
                    233: {
                    234:        Draw_Pic (x /* + ((vid.width - 320)>>1) */, y + (vid.height-SBAR_HEIGHT), pic);
                    235: }
                    236: 
                    237: /*
                    238: =============
                    239: Sbar_DrawSubPic
                    240: =============
                    241: JACK: Draws a portion of the picture in the status bar.
                    242: */
                    243: 
                    244: void Sbar_DrawSubPic(int x, int y, qpic_t *pic, int srcx, int srcy, int width, int height) 
                    245: {
                    246:        Draw_SubPic (x, y+(vid.height-SBAR_HEIGHT), pic, srcx, srcy, width, height);
                    247: }
                    248: 
                    249: 
                    250: /*
                    251: =============
                    252: Sbar_DrawTransPic
                    253: =============
                    254: */
                    255: void Sbar_DrawTransPic (int x, int y, qpic_t *pic)
                    256: {
                    257:        Draw_TransPic (x /*+ ((vid.width - 320)>>1) */, y + (vid.height-SBAR_HEIGHT), pic);
                    258: }
                    259: 
                    260: /*
                    261: ================
                    262: Sbar_DrawCharacter
                    263: 
                    264: Draws one solid graphics character
                    265: ================
                    266: */
                    267: void Sbar_DrawCharacter (int x, int y, int num)
                    268: {
                    269:        Draw_Character ( x /*+ ((vid.width - 320)>>1) */ + 4, y + vid.height-SBAR_HEIGHT, num);
                    270: }
                    271: 
                    272: /*
                    273: ================
                    274: Sbar_DrawString
                    275: ================
                    276: */
                    277: void Sbar_DrawString (int x, int y, char *str)
                    278: {
                    279:        Draw_String (x /*+ ((vid.width - 320)>>1) */, y+ vid.height-SBAR_HEIGHT, str);
                    280: }
                    281: 
                    282: /*
                    283: =============
                    284: Sbar_itoa
                    285: =============
                    286: */
                    287: int Sbar_itoa (int num, char *buf)
                    288: {
                    289:        char    *str;
                    290:        int             pow10;
                    291:        int             dig;
                    292:        
                    293:        str = buf;
                    294:        
                    295:        if (num < 0)
                    296:        {
                    297:                *str++ = '-';
                    298:                num = -num;
                    299:        }
                    300:        
                    301:        for (pow10 = 10 ; num >= pow10 ; pow10 *= 10)
                    302:        ;
                    303:        
                    304:        do
                    305:        {
                    306:                pow10 /= 10;
                    307:                dig = num/pow10;
                    308:                *str++ = '0'+dig;
                    309:                num -= dig*pow10;
                    310:        } while (pow10 != 1);
                    311:        
                    312:        *str = 0;
                    313:        
                    314:        return str-buf;
                    315: }
                    316: 
                    317: 
                    318: /*
                    319: =============
                    320: Sbar_DrawNum
                    321: =============
                    322: */
                    323: void Sbar_DrawNum (int x, int y, int num, int digits, int color)
                    324: {
                    325:        char                    str[12];
                    326:        char                    *ptr;
                    327:        int                             l, frame;
                    328: 
                    329:        l = Sbar_itoa (num, str);
                    330:        ptr = str;
                    331:        if (l > digits)
                    332:                ptr += (l-digits);
                    333:        if (l < digits)
                    334:                x += (digits-l)*24;
                    335: 
                    336:        while (*ptr)
                    337:        {
                    338:                if (*ptr == '-')
                    339:                        frame = STAT_MINUS;
                    340:                else
                    341:                        frame = *ptr -'0';
                    342: 
                    343:                Sbar_DrawTransPic (x,y,sb_nums[color][frame]);
                    344:                x += 24;
                    345:                ptr++;
                    346:        }
                    347: }
                    348: 
                    349: //=============================================================================
                    350: 
                    351: //ZOID: this should be MAX_CLIENTS, not MAX_SCOREBOARD!!
                    352: //int          fragsort[MAX_SCOREBOARD];
                    353: int            fragsort[MAX_CLIENTS];
                    354: int            scoreboardlines;
                    355: typedef struct {
                    356:        char team[16+1];
                    357:        int frags;
                    358:        int players;
                    359:        int plow, phigh, ptotal;
                    360: } team_t;
                    361: team_t teams[MAX_CLIENTS];
                    362: int teamsort[MAX_CLIENTS];
                    363: int scoreboardteams;
                    364: 
                    365: /*
                    366: ===============
                    367: Sbar_SortFrags
                    368: ===============
                    369: */
                    370: void Sbar_SortFrags (qboolean includespec)
                    371: {
                    372:        int             i, j, k;
                    373:                
                    374: // sort by frags
                    375:        scoreboardlines = 0;
                    376:        for (i=0 ; i<MAX_CLIENTS ; i++)
                    377:        {
                    378:                if (cl.players[i].name[0] &&
                    379:                        (!cl.players[i].spectator || includespec))
                    380:                {
                    381:                        fragsort[scoreboardlines] = i;
                    382:                        scoreboardlines++;
                    383:                        if (cl.players[i].spectator)
                    384:                                cl.players[i].frags = -999;
                    385:                }
                    386:        }
                    387:                
                    388:        for (i=0 ; i<scoreboardlines ; i++)
                    389:                for (j=0 ; j<scoreboardlines-1-i ; j++)
                    390:                        if (cl.players[fragsort[j]].frags < cl.players[fragsort[j+1]].frags)
                    391:                        {
                    392:                                k = fragsort[j];
                    393:                                fragsort[j] = fragsort[j+1];
                    394:                                fragsort[j+1] = k;
                    395:                        }
                    396: }
                    397: 
                    398: void Sbar_SortTeams (void)
                    399: {
                    400:        int                             i, j, k;
                    401:        player_info_t   *s;
                    402:        int                             teamplay;
                    403:        char t[16+1];
                    404: 
                    405: // request new ping times every two second
                    406:        scoreboardteams = 0;
                    407: 
                    408:        teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay"));
                    409:        if (!teamplay)
                    410:                return;
                    411: 
                    412: // sort the teams
                    413:        memset(teams, 0, sizeof(teams));
                    414:        for (i = 0; i < MAX_CLIENTS; i++)
                    415:                teams[i].plow = 999;
                    416: 
                    417:        for (i = 0; i < MAX_CLIENTS; i++) {
                    418:                s = &cl.players[i];
                    419:                if (!s->name[0])
                    420:                        continue;
                    421:                if (s->spectator)
                    422:                        continue;
                    423: 
                    424:                // find his team in the list
                    425:                t[16] = 0;
                    426:                strncpy(t, Info_ValueForKey(s->userinfo, "team"), 16);
                    427:                if (!t || !t[0])
                    428:                        continue; // not on team
                    429:                for (j = 0; j < scoreboardteams; j++)
                    430:                        if (!strcmp(teams[j].team, t)) {
                    431:                                teams[j].frags += s->frags;
                    432:                                teams[j].players++;
                    433:                                goto addpinginfo;
                    434:                        }
                    435:                if (j == scoreboardteams) { // must add him
                    436:                        j = scoreboardteams++;
                    437:                        strcpy(teams[j].team, t);
                    438:                        teams[j].frags = s->frags;
                    439:                        teams[j].players = 1;
                    440: addpinginfo:
                    441:                        if (teams[j].plow > s->ping)
                    442:                                teams[j].plow = s->ping;
                    443:                        if (teams[j].phigh < s->ping)
                    444:                                teams[j].phigh = s->ping;
                    445:                        teams[j].ptotal += s->ping;
                    446:                }
                    447:        }
                    448: 
                    449:        // sort
                    450:        for (i = 0; i < scoreboardteams; i++)
                    451:                teamsort[i] = i;
                    452: 
                    453:        // good 'ol bubble sort
                    454:        for (i = 0; i < scoreboardteams - 1; i++)
                    455:                for (j = i + 1; j < scoreboardteams; j++)
                    456:                        if (teams[teamsort[i]].frags < teams[teamsort[j]].frags) {
                    457:                                k = teamsort[i];
                    458:                                teamsort[i] = teamsort[j];
                    459:                                teamsort[j] = k;
                    460:                        }
                    461: }
                    462: 
                    463: int    Sbar_ColorForMap (int m)
                    464: {
                    465:        m = (m < 0) ? 0 : ((m > 13) ? 13 : m);
                    466: 
                    467:        m *= 16;
                    468:        return m < 128 ? m + 8 : m + 8;
                    469: }
                    470: 
                    471: 
                    472: /*
                    473: ===============
                    474: Sbar_SoloScoreboard
                    475: ===============
                    476: */
                    477: void Sbar_SoloScoreboard (void)
                    478: {
                    479:        char    str[80];
                    480:        int             minutes, seconds, tens, units;
                    481: 
                    482:        Sbar_DrawPic (0, 0, sb_scorebar);
                    483: 
                    484:        // time
                    485:        minutes = cl.time / 60;
                    486:        seconds = cl.time - 60*minutes;
                    487:        tens = seconds / 10;
                    488:        units = seconds - 10*tens;
                    489:        sprintf (str,"Time :%3i:%i%i", minutes, tens, units);
                    490:        Sbar_DrawString (184, 4, str);
                    491: }
                    492: 
                    493: //=============================================================================
                    494: 
                    495: /*
                    496: ===============
                    497: Sbar_DrawInventory
                    498: ===============
                    499: */
                    500: void Sbar_DrawInventory (void)
                    501: {      
                    502:        int             i;
                    503:        char    num[6];
                    504:        float   time;
                    505:        int             flashon;
                    506:        qboolean        headsup;
                    507:        qboolean    hudswap;
                    508: 
                    509:        headsup = !(cl_sbar.value || scr_viewsize.value<100);
                    510:        hudswap = cl_hudswap.value; // Get that nasty float out :)
                    511: 
                    512:        if (!headsup)
                    513:                Sbar_DrawPic (0, -24, sb_ibar);
                    514: // weapons
                    515:        for (i=0 ; i<7 ; i++)
                    516:        {
                    517:                if (cl.stats[STAT_ITEMS] & (IT_SHOTGUN<<i) )
                    518:                {
                    519:                        time = cl.item_gettime[i];
                    520:                        flashon = (int)((cl.time - time)*10);
                    521:                        if (flashon < 0)
                    522:                                flashon = 0;
                    523:                        if (flashon >= 10)
                    524:                        {
                    525:                                if ( cl.stats[STAT_ACTIVEWEAPON] == (IT_SHOTGUN<<i)  )
                    526:                                        flashon = 1;
                    527:                                else
                    528:                                        flashon = 0;
                    529:                        }
                    530:                        else
                    531:                                flashon = (flashon%5) + 2;
                    532: 
                    533:                        if (headsup) {
                    534:                                if (i || vid.height>200)
                    535:                                        Sbar_DrawSubPic ((hudswap) ? 0 : (vid.width-24),-68-(7-i)*16 , sb_weapons[flashon][i],0,0,24,16);
                    536:                        
                    537:                        } else 
                    538:                        Sbar_DrawPic (i*24, -16, sb_weapons[flashon][i]);
                    539: //                     Sbar_DrawSubPic (0,0,20,20,i*24, -16, sb_weapons[flashon][i]);
                    540: 
                    541:                        if (flashon > 1)
                    542:                                sb_updates = 0;         // force update to remove flash
                    543:                }
                    544:        }
                    545: 
                    546: // ammo counts
                    547:        for (i=0 ; i<4 ; i++)
                    548:        {
                    549:                sprintf (num, "%3i",cl.stats[STAT_SHELLS+i] );
                    550:                if (headsup) {
                    551: //                     Sbar_DrawSubPic(3, -24, sb_ibar, 3, 0, 42,11);
                    552:                        Sbar_DrawSubPic((hudswap) ? 0 : (vid.width-42), -24 - (4-i)*11, sb_ibar, 3+(i*48), 0, 42, 11);
                    553:                        if (num[0] != ' ')
                    554:                                Sbar_DrawCharacter ( (hudswap) ? 3 : (vid.width-39), -24 - (4-i)*11, 18 + num[0] - '0');
                    555:                        if (num[1] != ' ')
                    556:                                Sbar_DrawCharacter ( (hudswap) ? 11 : (vid.width-31), -24 - (4-i)*11, 18 + num[1] - '0');
                    557:                        if (num[2] != ' ')
                    558:                                Sbar_DrawCharacter ( (hudswap) ? 19 : (vid.width-23), -24 - (4-i)*11, 18 + num[2] - '0');
                    559:                } else {
                    560:                if (num[0] != ' ')
                    561:                        Sbar_DrawCharacter ( (6*i+1)*8 - 2, -24, 18 + num[0] - '0');
                    562:                if (num[1] != ' ')
                    563:                        Sbar_DrawCharacter ( (6*i+2)*8 - 2, -24, 18 + num[1] - '0');
                    564:                if (num[2] != ' ')
                    565:                        Sbar_DrawCharacter ( (6*i+3)*8 - 2, -24, 18 + num[2] - '0');
                    566:        }
                    567:        }
                    568:        
                    569:        flashon = 0;
                    570: // items
                    571:        for (i=0 ; i<6 ; i++)
                    572:                if (cl.stats[STAT_ITEMS] & (1<<(17+i)))
                    573:                {
                    574:                        time = cl.item_gettime[17+i];
                    575:                        if (time &&     time > cl.time - 2 && flashon )
                    576:                        {       // flash frame
                    577:                                sb_updates = 0;
                    578:                        }
                    579:                        else
                    580:                                Sbar_DrawPic (192 + i*16, -16, sb_items[i]);            
                    581:                        if (time &&     time > cl.time - 2)
                    582:                                sb_updates = 0;
                    583:                }
                    584: 
                    585: // sigils
                    586:        for (i=0 ; i<4 ; i++)
                    587:                if (cl.stats[STAT_ITEMS] & (1<<(28+i)))
                    588:                {
                    589:                        time = cl.item_gettime[28+i];
                    590:                        if (time &&     time > cl.time - 2 && flashon )
                    591:                        {       // flash frame
                    592:                                sb_updates = 0;
                    593:                        }
                    594:                        else
                    595:                                Sbar_DrawPic (320-32 + i*8, -16, sb_sigil[i]);          
                    596:                        if (time &&     time > cl.time - 2)
                    597:                                sb_updates = 0;
                    598:                }
                    599: }
                    600: 
                    601: //=============================================================================
                    602: 
                    603: /*
                    604: ===============
                    605: Sbar_DrawFrags
                    606: ===============
                    607: */
                    608: void Sbar_DrawFrags (void)
                    609: {      
                    610:        int                             i, k, l;
                    611:        int                             top, bottom;
                    612:        int                             x, y, f;
                    613:        char                    num[12];
                    614:        player_info_t   *s;
                    615:        
                    616:        Sbar_SortFrags (false);
                    617: 
                    618: // draw the text
                    619:        l = scoreboardlines <= 4 ? scoreboardlines : 4;
                    620:        
                    621:        x = 23;
                    622: //     xofs = (vid.width - 320)>>1;
                    623:        y = vid.height - SBAR_HEIGHT - 23;
                    624: 
                    625:        for (i=0 ; i<l ; i++)
                    626:        {
                    627:                k = fragsort[i];
                    628:                s = &cl.players[k];
                    629:                if (!s->name[0])
                    630:                        continue;
                    631:                if (s->spectator)
                    632:                        continue;
                    633: 
                    634:        // draw background
                    635:                top = s->topcolor;
                    636:                bottom = s->bottomcolor;
                    637:                top = (top < 0) ? 0 : ((top > 13) ? 13 : top);
                    638:                bottom = (bottom < 0) ? 0 : ((bottom > 13) ? 13 : bottom);
                    639: 
                    640:                top = Sbar_ColorForMap (top);
                    641:                bottom = Sbar_ColorForMap (bottom);
                    642:        
                    643: //             Draw_Fill (xofs + x*8 + 10, y, 28, 4, top);
                    644: //             Draw_Fill (xofs + x*8 + 10, y+4, 28, 3, bottom);
                    645:                Draw_Fill (x*8 + 10, y, 28, 4, top);
                    646:                Draw_Fill (x*8 + 10, y+4, 28, 3, bottom);
                    647: 
                    648:        // draw number
                    649:                f = s->frags;
                    650:                sprintf (num, "%3i",f);
                    651:                
                    652:                Sbar_DrawCharacter ( (x+1)*8 , -24, num[0]);
                    653:                Sbar_DrawCharacter ( (x+2)*8 , -24, num[1]);
                    654:                Sbar_DrawCharacter ( (x+3)*8 , -24, num[2]);
                    655: 
                    656:                if (k == cl.playernum)
                    657:                {
                    658:                        Sbar_DrawCharacter (x*8+2, -24, 16);
                    659:                        Sbar_DrawCharacter ( (x+4)*8-4, -24, 17);
                    660:                }
                    661:                x+=4;
                    662:        }
                    663: }
                    664: 
                    665: //=============================================================================
                    666: 
                    667: 
                    668: /*
                    669: ===============
                    670: Sbar_DrawFace
                    671: ===============
                    672: */
                    673: void Sbar_DrawFace (void)
                    674: {
                    675:        int             f, anim;
                    676: 
                    677:        if ( (cl.stats[STAT_ITEMS] & (IT_INVISIBILITY | IT_INVULNERABILITY) )
                    678:        == (IT_INVISIBILITY | IT_INVULNERABILITY) )
                    679:        {
                    680:                Sbar_DrawPic (112, 0, sb_face_invis_invuln);
                    681:                return;
                    682:        }
                    683:        if (cl.stats[STAT_ITEMS] & IT_QUAD) 
                    684:        {
                    685:                Sbar_DrawPic (112, 0, sb_face_quad );
                    686:                return;
                    687:        }
                    688:        if (cl.stats[STAT_ITEMS] & IT_INVISIBILITY) 
                    689:        {
                    690:                Sbar_DrawPic (112, 0, sb_face_invis );
                    691:                return;
                    692:        }
                    693:        if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY) 
                    694:        {
                    695:                Sbar_DrawPic (112, 0, sb_face_invuln);
                    696:                return;
                    697:        }
                    698: 
                    699:        if (cl.stats[STAT_HEALTH] >= 100)
                    700:                f = 4;
                    701:        else
                    702:                f = cl.stats[STAT_HEALTH] / 20;
                    703:        
                    704:        if (cl.time <= cl.faceanimtime)
                    705:        {
                    706:                anim = 1;
                    707:                sb_updates = 0;         // make sure the anim gets drawn over
                    708:        }
                    709:        else
                    710:                anim = 0;
                    711:        Sbar_DrawPic (112, 0, sb_faces[f][anim]);
                    712: }
                    713: 
                    714: /*
                    715: =============
                    716: Sbar_DrawNormal
                    717: =============
                    718: */
                    719: void Sbar_DrawNormal (void)
                    720: {
                    721:        if (cl_sbar.value || scr_viewsize.value<100)
                    722:        Sbar_DrawPic (0, 0, sb_sbar);
                    723: 
                    724: // armor
                    725:        if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY)
                    726:        {
                    727:                Sbar_DrawNum (24, 0, 666, 3, 1);
                    728:                Sbar_DrawPic (0, 0, draw_disc);
                    729:        }
                    730:        else
                    731:        {
                    732:                Sbar_DrawNum (24, 0, cl.stats[STAT_ARMOR], 3
                    733:                , cl.stats[STAT_ARMOR] <= 25);
                    734:                if (cl.stats[STAT_ITEMS] & IT_ARMOR3)
                    735:                        Sbar_DrawPic (0, 0, sb_armor[2]);
                    736:                else if (cl.stats[STAT_ITEMS] & IT_ARMOR2)
                    737:                        Sbar_DrawPic (0, 0, sb_armor[1]);
                    738:                else if (cl.stats[STAT_ITEMS] & IT_ARMOR1)
                    739:                        Sbar_DrawPic (0, 0, sb_armor[0]);
                    740:        }
                    741:        
                    742: // face
                    743:        Sbar_DrawFace ();
                    744:        
                    745: // health
                    746:        Sbar_DrawNum (136, 0, cl.stats[STAT_HEALTH], 3
                    747:        , cl.stats[STAT_HEALTH] <= 25);
                    748: 
                    749: // ammo icon
                    750:        if (cl.stats[STAT_ITEMS] & IT_SHELLS)
                    751:                Sbar_DrawPic (224, 0, sb_ammo[0]);
                    752:        else if (cl.stats[STAT_ITEMS] & IT_NAILS)
                    753:                Sbar_DrawPic (224, 0, sb_ammo[1]);
                    754:        else if (cl.stats[STAT_ITEMS] & IT_ROCKETS)
                    755:                Sbar_DrawPic (224, 0, sb_ammo[2]);
                    756:        else if (cl.stats[STAT_ITEMS] & IT_CELLS)
                    757:                Sbar_DrawPic (224, 0, sb_ammo[3]);
                    758:        
                    759:        Sbar_DrawNum (248, 0, cl.stats[STAT_AMMO], 3
                    760:        , cl.stats[STAT_AMMO] <= 10);
                    761: }
                    762: 
                    763: /*
                    764: ===============
                    765: Sbar_Draw
                    766: ===============
                    767: */
                    768: void Sbar_Draw (void)
                    769: {
                    770:        qboolean headsup;
                    771:        char st[512];
                    772: 
                    773:        headsup = !(cl_sbar.value || scr_viewsize.value<100);
                    774:        if ((sb_updates >= vid.numpages) && !headsup)
                    775:                return;
                    776: 
                    777:        if (scr_con_current == vid.height)
                    778:                return;         // console is full screen
                    779: 
                    780:        scr_copyeverything = 1;
                    781: //     scr_fullupdate = 0;
                    782: 
                    783:        sb_updates++;
                    784:                
                    785: // top line
                    786:        if (sb_lines > 24)
                    787:        {
                    788:                if (!cl.spectator || autocam == CAM_TRACK)
                    789:                        Sbar_DrawInventory ();
                    790:                if (!headsup || vid.width<512)
                    791:                        Sbar_DrawFrags ();
                    792:        }       
                    793: 
                    794: // main area
                    795:        if (sb_lines > 0)
                    796:        {
                    797:                if (cl.spectator) {
                    798:                        if (autocam != CAM_TRACK) {
                    799:                                Sbar_DrawPic (0, 0, sb_scorebar);
                    800:                                Sbar_DrawString (160-7*8,4, "SPECTATOR MODE");
                    801:                                Sbar_DrawString(160-14*8+4, 12, "Press [ATTACK] for AutoCamera");
                    802:                        } else {
                    803:                                if (sb_showscores || cl.stats[STAT_HEALTH] <= 0)
                    804:                                        Sbar_SoloScoreboard ();
                    805:                                else
                    806:                                        Sbar_DrawNormal ();
                    807: 
                    808: //                                     Sbar_DrawString (160-14*8+4,4, "SPECTATOR MODE - TRACK CAMERA");
                    809:                                sprintf(st, "Tracking %-.13s, [JUMP] for next",
                    810:                                                cl.players[spec_track].name);
                    811:                                Sbar_DrawString(0, -8, st);
                    812:                        }
                    813:                } else if (sb_showscores || cl.stats[STAT_HEALTH] <= 0)
                    814:                        Sbar_SoloScoreboard ();
                    815:                else
                    816:                        Sbar_DrawNormal ();
                    817:        }
                    818: 
                    819: // main screen deathmatch rankings
                    820:        // if we're dead show team scores in team games
                    821:        if (cl.stats[STAT_HEALTH] <= 0 && !cl.spectator)
                    822:                if (atoi(Info_ValueForKey(cl.serverinfo, "teamplay")) > 0 &&
                    823:                        !sb_showscores)
                    824:                        Sbar_TeamOverlay();
                    825:                else
                    826:                        Sbar_DeathmatchOverlay (0);
                    827:        else if (sb_showscores)
                    828:                Sbar_DeathmatchOverlay (0);
                    829:        else if (sb_showteamscores)
                    830:                Sbar_TeamOverlay();
                    831: 
                    832: #ifdef GLQUAKE
                    833:        if (sb_showscores || sb_showteamscores || 
                    834:                cl.stats[STAT_HEALTH] <= 0)
                    835:                sb_updates = 0;
                    836:        // clear unused areas in gl
                    837: #if 0
                    838:        {
                    839:                int x = (vid.width - 320)>>1;
                    840: 
                    841:                // left
                    842:                if (x > 0) {
                    843:                        Draw_TileClear (0, vid.height - sb_lines, x, sb_lines);
                    844:                        Draw_TileClear (x+320, vid.height - sb_lines, vid.width - x+320, sb_lines);
                    845:                }
                    846:        }
                    847: #endif
                    848:        if (vid.width > 320 && !headsup)
                    849:                Draw_TileClear (320, vid.height - sb_lines, vid.width - 320, sb_lines);
                    850: #endif
                    851: 
                    852:        if (sb_lines > 0)
                    853:                Sbar_MiniDeathmatchOverlay ();
                    854: }
                    855: 
                    856: //=============================================================================
                    857: 
                    858: /*
                    859: ==================
                    860: Sbar_IntermissionNumber
                    861: 
                    862: ==================
                    863: */
                    864: void Sbar_IntermissionNumber (int x, int y, int num, int digits, int color)
                    865: {
                    866:        char                    str[12];
                    867:        char                    *ptr;
                    868:        int                             l, frame;
                    869: 
                    870:        l = Sbar_itoa (num, str);
                    871:        ptr = str;
                    872:        if (l > digits)
                    873:                ptr += (l-digits);
                    874:        if (l < digits)
                    875:                x += (digits-l)*24;
                    876: 
                    877:        while (*ptr)
                    878:        {
                    879:                if (*ptr == '-')
                    880:                        frame = STAT_MINUS;
                    881:                else
                    882:                        frame = *ptr -'0';
                    883: 
                    884:                Draw_TransPic (x,y,sb_nums[color][frame]);
                    885:                x += 24;
                    886:                ptr++;
                    887:        }
                    888: }
                    889: 
                    890: /*
                    891: ==================
                    892: Sbar_TeamOverlay
                    893: 
                    894: team frags
                    895: added by Zoid
                    896: ==================
                    897: */
                    898: void Sbar_TeamOverlay (void)
                    899: {
                    900:        qpic_t                  *pic;
                    901:        int                             i, k, l;
                    902:        int                             x, y;
                    903:        char                    num[12];
                    904:        int                             teamplay;
                    905:        char                    team[5];
                    906:        team_t *tm;
                    907:        int plow, phigh, pavg;
                    908: 
                    909: // request new ping times every two second
                    910:        teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay"));
                    911: 
                    912:        if (!teamplay) {
                    913:                Sbar_DeathmatchOverlay(0);
                    914:                return;
                    915:        }
                    916: 
                    917:        scr_copyeverything = 1;
                    918:        scr_fullupdate = 0;
                    919: 
                    920:        pic = Draw_CachePic ("gfx/ranking.lmp");
                    921:        Draw_Pic (160-pic->width/2, 0, pic);
                    922: 
                    923:        y = 24;
                    924:        x = 36;
                    925:        Draw_String(x, y, "low/avg/high team total players");
                    926:        y += 8;
                    927: //     Draw_String(x, y, "------------ ---- ----- -------");
                    928:        Draw_String(x, y, "\x1d\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1f \x1d\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1e\x1e\x1f");
                    929:        y += 8;
                    930: 
                    931: // sort the teams
                    932:        Sbar_SortTeams();
                    933: 
                    934: // draw the text
                    935:        l = scoreboardlines;
                    936: 
                    937:        for (i=0 ; i < scoreboardteams && y <= vid.height-10 ; i++)
                    938:        {
                    939:                k = teamsort[i];
                    940:                tm = teams + k;
                    941: 
                    942:        // draw pings
                    943:                plow = tm->plow;
                    944:                if (plow < 0 || plow > 999)
                    945:                        plow = 999;
                    946:                phigh = tm->phigh;
                    947:                if (phigh < 0 || phigh > 999)
                    948:                        phigh = 999;
                    949:                if (!tm->players)
                    950:                        pavg = 999;
                    951:                else
                    952:                        pavg = tm->ptotal / tm->players;
                    953:                if (pavg < 0 || pavg > 999)
                    954:                        pavg = 999;
                    955: 
                    956:                sprintf (num, "%3i/%3i/%3i", plow, pavg, phigh);
                    957:                Draw_String ( x, y, num);
                    958: 
                    959:        // draw team
                    960:                team[4] = 0;
                    961:                strncpy (team, tm->team, 4);
                    962:                Draw_String (x + 104, y, team);
                    963: 
                    964:        // draw total
                    965:                sprintf (num, "%5i", tm->frags);
                    966:                Draw_String (x + 104 + 40, y, num);
                    967:                
                    968:        // draw players
                    969:                sprintf (num, "%5i", tm->players);
                    970:                Draw_String (x + 104 + 88, y, num);
                    971:                
                    972:                if (!strncmp(Info_ValueForKey(cl.players[cl.playernum].userinfo,
                    973:                        "team"), tm->team, 16)) {
                    974:                        Draw_Character ( x + 104 - 8, y, 16);
                    975:                        Draw_Character ( x + 104 + 32, y, 17);
                    976:                }
                    977:                
                    978:                y += 8;
                    979:        }
                    980:        y += 8;
                    981:        Sbar_DeathmatchOverlay(y);
                    982: }
                    983: 
                    984: /*
                    985: ==================
                    986: Sbar_DeathmatchOverlay
                    987: 
                    988: ping time frags name
                    989: ==================
                    990: */
                    991: void Sbar_DeathmatchOverlay (int start)
                    992: {
                    993:        qpic_t                  *pic;
                    994:        int                             i, k, l;
                    995:        int                             top, bottom;
                    996:        int                             x, y, f;
                    997:        char                    num[12];
                    998:        player_info_t   *s;
                    999:        int                             total;
                   1000:        int                             minutes;
                   1001:        int                             p;
                   1002:        int                             teamplay;
                   1003:        char                    team[5];
                   1004:        int                             skip = 10;
                   1005: 
                   1006:        if (largegame)
                   1007:                skip = 8;
                   1008: 
                   1009: // request new ping times every two second
                   1010:        if (realtime - cl.last_ping_request > 2)
                   1011:        {
                   1012:                cl.last_ping_request = realtime;
                   1013:                MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
                   1014:                SZ_Print (&cls.netchan.message, "pings");
                   1015:        }
                   1016: 
                   1017:        teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay"));
                   1018: 
                   1019:        scr_copyeverything = 1;
                   1020:        scr_fullupdate = 0;
                   1021: 
                   1022:        if (!start) {
                   1023:                pic = Draw_CachePic ("gfx/ranking.lmp");
                   1024:                Draw_Pic (160-pic->width/2, 0, pic);
                   1025:        }
                   1026: 
                   1027: // scores      
                   1028:        Sbar_SortFrags (true);
                   1029: 
                   1030: // draw the text
                   1031:        l = scoreboardlines;
                   1032: 
                   1033:        if (start)
                   1034:                y = start;
                   1035:        else
                   1036:                y = 24;
                   1037:        if (teamplay)
                   1038:        {
                   1039:                x = 4;
                   1040: //                            0    40 64   104   152  192 
                   1041:                Draw_String ( x , y, "ping pl time frags team name");
                   1042:                y += 8;
                   1043: //             Draw_String ( x , y, "---- -- ---- ----- ---- ----------------");
                   1044:                Draw_String ( x , y, "\x1d\x1e\x1e\x1f \x1d\x1f \x1d\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1f \x1d\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1f");
                   1045:                y += 8;
                   1046:        }
                   1047:        else
                   1048:        {
                   1049:                x = 16;
                   1050: //                            0    40 64   104   152
                   1051:                Draw_String ( x , y, "ping pl time frags name");
                   1052:                y += 8;
                   1053: //             Draw_String ( x , y, "---- -- ---- ----- ----------------");
                   1054:                Draw_String ( x , y, "\x1d\x1e\x1e\x1f \x1d\x1f \x1d\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1f \x1d\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1e\x1f");
                   1055:                y += 8;
                   1056:        }
                   1057: 
                   1058:        for (i=0 ; i<l && y <= vid.height-10 ; i++)
                   1059:        {
                   1060:                k = fragsort[i];
                   1061:                s = &cl.players[k];
                   1062:                if (!s->name[0])
                   1063:                        continue;
                   1064: 
                   1065:                // draw ping
                   1066:                p = s->ping;
                   1067:                if (p < 0 || p > 999)
                   1068:                        p = 999;
                   1069:                sprintf (num, "%4i", p);
                   1070:                Draw_String ( x, y, num);
                   1071: 
                   1072:                // draw pl
                   1073:                p = s->pl;
                   1074:                sprintf (num, "%3i", p);
                   1075:                if (p > 25)
                   1076:                        Draw_Alt_String ( x+32, y, num);
                   1077:                else
                   1078:                        Draw_String ( x+32, y, num);
                   1079: 
                   1080:                if (s->spectator)
                   1081:                {
                   1082:                        Draw_String (x+40, y, "(spectator)");
                   1083:                        // draw name
                   1084:                        if (teamplay)
                   1085:                                Draw_String (x+152+40, y, s->name);
                   1086:                        else
                   1087:                                Draw_String (x+152, y, s->name);
                   1088:                        y += skip;
                   1089:                        continue;
                   1090:                }
                   1091: 
                   1092: 
                   1093:                // draw time
                   1094:                if (cl.intermission)
                   1095:                        total = cl.completed_time - s->entertime;
                   1096:                else
                   1097:                        total = realtime - s->entertime;
                   1098:                minutes = (int)total/60;
                   1099:                sprintf (num, "%4i", minutes);
                   1100:                Draw_String ( x+64 , y, num);
                   1101: 
                   1102:                // draw background
                   1103:                top = s->topcolor;
                   1104:                bottom = s->bottomcolor;
                   1105:                top = Sbar_ColorForMap (top);
                   1106:                bottom = Sbar_ColorForMap (bottom);
                   1107:        
                   1108:                if (largegame)
                   1109:                        Draw_Fill ( x+104, y+1, 40, 3, top);
                   1110:                else
                   1111:                        Draw_Fill ( x+104, y, 40, 4, top);
                   1112:                Draw_Fill ( x+104, y+4, 40, 4, bottom);
                   1113: 
                   1114:        // draw number
                   1115:                f = s->frags;
                   1116:                sprintf (num, "%3i",f);
                   1117:                
                   1118:                Draw_Character ( x+112 , y, num[0]);
                   1119:                Draw_Character ( x+120 , y, num[1]);
                   1120:                Draw_Character ( x+128 , y, num[2]);
                   1121: 
                   1122:                if (k == cl.playernum)
                   1123:                {
                   1124:                        Draw_Character ( x + 104, y, 16);
                   1125:                        Draw_Character ( x + 136, y, 17);
                   1126:                }
                   1127:                
                   1128:                // team
                   1129:                if (teamplay)
                   1130:                {
                   1131:                        team[4] = 0;
                   1132:                        strncpy (team, Info_ValueForKey(s->userinfo, "team"), 4);
                   1133:                        Draw_String (x+152, y, team);
                   1134:                }
                   1135: 
                   1136:                // draw name
                   1137:                if (teamplay)
                   1138:                        Draw_String (x+152+40, y, s->name);
                   1139:                else
                   1140:                        Draw_String (x+152, y, s->name);
                   1141:                
                   1142:                y += skip;
                   1143:        }
                   1144: 
                   1145:        if (y >= vid.height-10) // we ran over the screen size, squish
                   1146:                largegame = true;
                   1147: }
                   1148: 
                   1149: /*
                   1150: ==================
                   1151: Sbar_MiniDeathmatchOverlay
                   1152: 
                   1153: frags name
                   1154: frags team name
                   1155: displayed to right of status bar if there's room
                   1156: ==================
                   1157: */
                   1158: void Sbar_MiniDeathmatchOverlay (void)
                   1159: {
                   1160:        int                             i, k;
                   1161:        int                             top, bottom;
                   1162:        int                             x, y, f;
                   1163:        char                    num[12];
                   1164:        player_info_t   *s;
                   1165:        int                             teamplay;
                   1166:        char                    team[5];
                   1167:        int                             numlines;
                   1168:        char                    name[16+1];
                   1169:        team_t                  *tm;
                   1170: 
                   1171:        if (vid.width < 512 || !sb_lines)
                   1172:                return; // not enuff room
                   1173: 
                   1174:        teamplay = atoi(Info_ValueForKey(cl.serverinfo, "teamplay"));
                   1175: 
                   1176:        scr_copyeverything = 1;
                   1177:        scr_fullupdate = 0;
                   1178: 
                   1179: // scores      
                   1180:        Sbar_SortFrags (false);
                   1181:        if (vid.width >= 640)
                   1182:                Sbar_SortTeams();
                   1183: 
                   1184:        if (!scoreboardlines)
                   1185:                return; // no one there?
                   1186: 
                   1187: // draw the text
                   1188:        y = vid.height - sb_lines - 1;
                   1189:        numlines = sb_lines/8;
                   1190:        if (numlines < 3)
                   1191:                return; // not enough room
                   1192: 
                   1193:        // find us
                   1194:        for (i=0 ; i < scoreboardlines; i++)
                   1195:                if (fragsort[i] == cl.playernum)
                   1196:                        break;
                   1197: 
                   1198:        if (i == scoreboardlines) // we're not there, we are probably a spectator, just display top
                   1199:                i = 0;
                   1200:        else // figure out start
                   1201:                i = i - numlines/2;
                   1202: 
                   1203:        if (i > scoreboardlines - numlines)
                   1204:                i = scoreboardlines - numlines;
                   1205:        if (i < 0)
                   1206:                i = 0;
                   1207: 
                   1208:        x = 324;
                   1209: 
                   1210:        for (/* */ ; i < scoreboardlines && y < vid.height - 8 + 1; i++)
                   1211:        {
                   1212:                k = fragsort[i];
                   1213:                s = &cl.players[k];
                   1214:                if (!s->name[0])
                   1215:                        continue;
                   1216: 
                   1217:        // draw ping
                   1218:                top = s->topcolor;
                   1219:                bottom = s->bottomcolor;
                   1220:                top = Sbar_ColorForMap (top);
                   1221:                bottom = Sbar_ColorForMap (bottom);
                   1222:        
                   1223:                Draw_Fill ( x, y+1, 40, 3, top);
                   1224:                Draw_Fill ( x, y+4, 40, 4, bottom);
                   1225: 
                   1226:        // draw number
                   1227:                f = s->frags;
                   1228:                sprintf (num, "%3i",f);
                   1229:                
                   1230:                Draw_Character ( x+8 , y, num[0]);
                   1231:                Draw_Character ( x+16, y, num[1]);
                   1232:                Draw_Character ( x+24, y, num[2]);
                   1233: 
                   1234:                if (k == cl.playernum)
                   1235:                {
                   1236:                        Draw_Character ( x, y, 16);
                   1237:                        Draw_Character ( x + 32, y, 17);
                   1238:                }
                   1239:                
                   1240:        // team
                   1241:                if (teamplay)
                   1242:                {
                   1243:                        team[4] = 0;
                   1244:                        strncpy (team, Info_ValueForKey(s->userinfo, "team"), 4);
                   1245:                        Draw_String (x+48, y, team);
                   1246:                }
                   1247: 
                   1248:        // draw name
                   1249:                name[16] = 0;
                   1250:                strncpy(name, s->name, 16);
                   1251:                if (teamplay)
                   1252:                        Draw_String (x+48+40, y, name);
                   1253:                else
                   1254:                        Draw_String (x+48, y, name);
                   1255:                y += 8;
                   1256:        }
                   1257: 
                   1258:        // draw teams if room
                   1259:        if (vid.width < 640 || !teamplay)
                   1260:                return;
                   1261: 
                   1262:        // draw seperator
                   1263:        x += 208;
                   1264:        for (y = vid.height - sb_lines; y < vid.height - 6; y += 2)
                   1265:                Draw_Character(x, y, 14);
                   1266: 
                   1267:        x += 16;
                   1268: 
                   1269:        y = vid.height - sb_lines;
                   1270:        for (i=0 ; i < scoreboardteams && y <= vid.height; i++)
                   1271:        {
                   1272:                k = teamsort[i];
                   1273:                tm = teams + k;
                   1274: 
                   1275:        // draw pings
                   1276:                team[4] = 0;
                   1277:                strncpy (team, tm->team, 4);
                   1278:                Draw_String (x, y, team);
                   1279: 
                   1280:        // draw total
                   1281:                sprintf (num, "%5i", tm->frags);
                   1282:                Draw_String (x + 40, y, num);
                   1283:                
                   1284:                if (!strncmp(Info_ValueForKey(cl.players[cl.playernum].userinfo,
                   1285:                        "team"), tm->team, 16)) {
                   1286:                        Draw_Character ( x - 8, y, 16);
                   1287:                        Draw_Character ( x + 32, y, 17);
                   1288:                }
                   1289:                
                   1290:                y += 8;
                   1291:        }
                   1292: 
                   1293: }
                   1294: 
                   1295: 
                   1296: /*
                   1297: ==================
                   1298: Sbar_IntermissionOverlay
                   1299: 
                   1300: ==================
                   1301: */
                   1302: void Sbar_IntermissionOverlay (void)
                   1303: {
                   1304:        scr_copyeverything = 1;
                   1305:        scr_fullupdate = 0;
                   1306: 
                   1307:        if (atoi(Info_ValueForKey(cl.serverinfo, "teamplay")) > 0 && !sb_showscores)
                   1308:                Sbar_TeamOverlay ();
                   1309:        else
                   1310:                Sbar_DeathmatchOverlay (0);
                   1311: }
                   1312: 
                   1313: 
                   1314: /*
                   1315: ==================
                   1316: Sbar_FinaleOverlay
                   1317: 
                   1318: ==================
                   1319: */
                   1320: void Sbar_FinaleOverlay (void)
                   1321: {
                   1322:        qpic_t  *pic;
                   1323: 
                   1324:        scr_copyeverything = 1;
                   1325: 
                   1326:        pic = Draw_CachePic ("gfx/finale.lmp");
                   1327:        Draw_TransPic ( (vid.width-pic->width)/2, 16, pic);
                   1328: }
                   1329: 
                   1330: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.