|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.