home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / glquake_src / sbar.c < prev    next >
C/C++ Source or Header  |  1999-12-31  |  36KB  |  1,462 lines

  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.  
  49. int     sb_lines;     // scan lines to draw
  50.  
  51. qpic_t      *rsb_invbar[2];
  52. qpic_t      *rsb_weapons[5];
  53. qpic_t      *rsb_items[2];
  54. qpic_t      *rsb_ammo[3];
  55. qpic_t      *rsb_teambord;    // PGM 01/19/97 - team color border
  56.  
  57. //MED 01/04/97 added two more weapons + 3 alternates for grenade launcher
  58. qpic_t      *hsb_weapons[7][5];   // 0 is active, 1 is owned, 2-5 are flashes
  59. //MED 01/04/97 added array to simplify weapon parsing
  60. int         hipweapons[4] = {HIT_LASER_CANNON_BIT,HIT_MJOLNIR_BIT,4,HIT_PROXIMITY_GUN_BIT};
  61. //MED 01/04/97 added hipnotic items array
  62. qpic_t      *hsb_items[2];
  63.  
  64. void Sbar_MiniDeathmatchOverlay (void);
  65. void Sbar_DeathmatchOverlay (void);
  66. void M_DrawPic (int x, int y, qpic_t *pic);
  67.  
  68. /*
  69. ===============
  70. Sbar_ShowScores
  71.  
  72. Tab key down
  73. ===============
  74. */
  75. void Sbar_ShowScores (void)
  76. {
  77.   if (sb_showscores)
  78.     return;
  79.   sb_showscores = true;
  80.   sb_updates = 0;
  81. }
  82.  
  83. /*
  84. ===============
  85. Sbar_DontShowScores
  86.  
  87. Tab key up
  88. ===============
  89. */
  90. void Sbar_DontShowScores (void)
  91. {
  92.   sb_showscores = false;
  93.   sb_updates = 0;
  94. }
  95.  
  96. /*
  97. ===============
  98. Sbar_Changed
  99. ===============
  100. */
  101. void Sbar_Changed (void)
  102. {
  103.   sb_updates = 0; // update next frame
  104. }
  105.  
  106. /*
  107. ===============
  108. Sbar_Init
  109. ===============
  110. */
  111. void Sbar_Init (void)
  112. {
  113.   int   i;
  114.  
  115.   for (i=0 ; i<10 ; i++)
  116.   {
  117.     sb_nums[0][i] = Draw_PicFromWad (va("num_%i",i));
  118.     sb_nums[1][i] = Draw_PicFromWad (va("anum_%i",i));
  119.   }
  120.  
  121.   sb_nums[0][10] = Draw_PicFromWad ("num_minus");
  122.   sb_nums[1][10] = Draw_PicFromWad ("anum_minus");
  123.  
  124.   sb_colon = Draw_PicFromWad ("num_colon");
  125.   sb_slash = Draw_PicFromWad ("num_slash");
  126.  
  127.   sb_weapons[0][0] = Draw_PicFromWad ("inv_shotgun");
  128.   sb_weapons[0][1] = Draw_PicFromWad ("inv_sshotgun");
  129.   sb_weapons[0][2] = Draw_PicFromWad ("inv_nailgun");
  130.   sb_weapons[0][3] = Draw_PicFromWad ("inv_snailgun");
  131.   sb_weapons[0][4] = Draw_PicFromWad ("inv_rlaunch");
  132.   sb_weapons[0][5] = Draw_PicFromWad ("inv_srlaunch");
  133.   sb_weapons[0][6] = Draw_PicFromWad ("inv_lightng");
  134.  
  135.   sb_weapons[1][0] = Draw_PicFromWad ("inv2_shotgun");
  136.   sb_weapons[1][1] = Draw_PicFromWad ("inv2_sshotgun");
  137.   sb_weapons[1][2] = Draw_PicFromWad ("inv2_nailgun");
  138.   sb_weapons[1][3] = Draw_PicFromWad ("inv2_snailgun");
  139.   sb_weapons[1][4] = Draw_PicFromWad ("inv2_rlaunch");
  140.   sb_weapons[1][5] = Draw_PicFromWad ("inv2_srlaunch");
  141.   sb_weapons[1][6] = Draw_PicFromWad ("inv2_lightng");
  142.  
  143.   for (i=0 ; i<5 ; i++)
  144.   {
  145.     sb_weapons[2+i][0] = Draw_PicFromWad (va("inva%i_shotgun",i+1));
  146.     sb_weapons[2+i][1] = Draw_PicFromWad (va("inva%i_sshotgun",i+1));
  147.     sb_weapons[2+i][2] = Draw_PicFromWad (va("inva%i_nailgun",i+1));
  148.     sb_weapons[2+i][3] = Draw_PicFromWad (va("inva%i_snailgun",i+1));
  149.     sb_weapons[2+i][4] = Draw_PicFromWad (va("inva%i_rlaunch",i+1));
  150.     sb_weapons[2+i][5] = Draw_PicFromWad (va("inva%i_srlaunch",i+1));
  151.     sb_weapons[2+i][6] = Draw_PicFromWad (va("inva%i_lightng",i+1));
  152.   }
  153.  
  154.   sb_ammo[0] = Draw_PicFromWad ("sb_shells");
  155.   sb_ammo[1] = Draw_PicFromWad ("sb_nails");
  156.   sb_ammo[2] = Draw_PicFromWad ("sb_rocket");
  157.   sb_ammo[3] = Draw_PicFromWad ("sb_cells");
  158.  
  159.   sb_armor[0] = Draw_PicFromWad ("sb_armor1");
  160.   sb_armor[1] = Draw_PicFromWad ("sb_armor2");
  161.   sb_armor[2] = Draw_PicFromWad ("sb_armor3");
  162.  
  163.   sb_items[0] = Draw_PicFromWad ("sb_key1");
  164.   sb_items[1] = Draw_PicFromWad ("sb_key2");
  165.   sb_items[2] = Draw_PicFromWad ("sb_invis");
  166.   sb_items[3] = Draw_PicFromWad ("sb_invuln");
  167.   sb_items[4] = Draw_PicFromWad ("sb_suit");
  168.   sb_items[5] = Draw_PicFromWad ("sb_quad");
  169.  
  170.   sb_sigil[0] = Draw_PicFromWad ("sb_sigil1");
  171.   sb_sigil[1] = Draw_PicFromWad ("sb_sigil2");
  172.   sb_sigil[2] = Draw_PicFromWad ("sb_sigil3");
  173.   sb_sigil[3] = Draw_PicFromWad ("sb_sigil4");
  174.  
  175.   sb_faces[4][0] = Draw_PicFromWad ("face1");
  176.   sb_faces[4][1] = Draw_PicFromWad ("face_p1");
  177.   sb_faces[3][0] = Draw_PicFromWad ("face2");
  178.   sb_faces[3][1] = Draw_PicFromWad ("face_p2");
  179.   sb_faces[2][0] = Draw_PicFromWad ("face3");
  180.   sb_faces[2][1] = Draw_PicFromWad ("face_p3");
  181.   sb_faces[1][0] = Draw_PicFromWad ("face4");
  182.   sb_faces[1][1] = Draw_PicFromWad ("face_p4");
  183.   sb_faces[0][0] = Draw_PicFromWad ("face5");
  184.   sb_faces[0][1] = Draw_PicFromWad ("face_p5");
  185.  
  186.   sb_face_invis = Draw_PicFromWad ("face_invis");
  187.   sb_face_invuln = Draw_PicFromWad ("face_invul2");
  188.   sb_face_invis_invuln = Draw_PicFromWad ("face_inv2");
  189.   sb_face_quad = Draw_PicFromWad ("face_quad");
  190.  
  191.   Cmd_AddCommand ("+showscores", Sbar_ShowScores);
  192.   Cmd_AddCommand ("-showscores", Sbar_DontShowScores);
  193.  
  194.   sb_sbar = Draw_PicFromWad ("sbar");
  195.   sb_ibar = Draw_PicFromWad ("ibar");
  196.   sb_scorebar = Draw_PicFromWad ("scorebar");
  197.  
  198. //MED 01/04/97 added new hipnotic weapons
  199.   if (hipnotic)
  200.   {
  201.     hsb_weapons[0][0] = Draw_PicFromWad ("inv_laser");
  202.     hsb_weapons[0][1] = Draw_PicFromWad ("inv_mjolnir");
  203.     hsb_weapons[0][2] = Draw_PicFromWad ("inv_gren_prox");
  204.     hsb_weapons[0][3] = Draw_PicFromWad ("inv_prox_gren");
  205.     hsb_weapons[0][4] = Draw_PicFromWad ("inv_prox");
  206.  
  207.     hsb_weapons[1][0] = Draw_PicFromWad ("inv2_laser");
  208.     hsb_weapons[1][1] = Draw_PicFromWad ("inv2_mjolnir");
  209.     hsb_weapons[1][2] = Draw_PicFromWad ("inv2_gren_prox");
  210.     hsb_weapons[1][3] = Draw_PicFromWad ("inv2_prox_gren");
  211.     hsb_weapons[1][4] = Draw_PicFromWad ("inv2_prox");
  212.  
  213.     for (i=0 ; i<5 ; i++)
  214.     {
  215.      hsb_weapons[2+i][0] = Draw_PicFromWad (va("inva%i_laser",i+1));
  216.      hsb_weapons[2+i][1] = Draw_PicFromWad (va("inva%i_mjolnir",i+1));
  217.      hsb_weapons[2+i][2] = Draw_PicFromWad (va("inva%i_gren_prox",i+1));
  218.      hsb_weapons[2+i][3] = Draw_PicFromWad (va("inva%i_prox_gren",i+1));
  219.      hsb_weapons[2+i][4] = Draw_PicFromWad (va("inva%i_prox",i+1));
  220.     }
  221.  
  222.     hsb_items[0] = Draw_PicFromWad ("sb_wsuit");
  223.     hsb_items[1] = Draw_PicFromWad ("sb_eshld");
  224.   }
  225.  
  226.   if (rogue)
  227.   {
  228.     rsb_invbar[0] = Draw_PicFromWad ("r_invbar1");
  229.     rsb_invbar[1] = Draw_PicFromWad ("r_invbar2");
  230.  
  231.     rsb_weapons[0] = Draw_PicFromWad ("r_lava");
  232.     rsb_weapons[1] = Draw_PicFromWad ("r_superlava");
  233.     rsb_weapons[2] = Draw_PicFromWad ("r_gren");
  234.     rsb_weapons[3] = Draw_PicFromWad ("r_multirock");
  235.     rsb_weapons[4] = Draw_PicFromWad ("r_plasma");
  236.  
  237.     rsb_items[0] = Draw_PicFromWad ("r_shield1");
  238.         rsb_items[1] = Draw_PicFromWad ("r_agrav1");
  239.  
  240. // PGM 01/19/97 - team color border
  241.         rsb_teambord = Draw_PicFromWad ("r_teambord");
  242. // PGM 01/19/97 - team color border
  243.  
  244.     rsb_ammo[0] = Draw_PicFromWad ("r_ammolava");
  245.     rsb_ammo[1] = Draw_PicFromWad ("r_ammomulti");
  246.     rsb_ammo[2] = Draw_PicFromWad ("r_ammoplasma");
  247.   }
  248. }
  249.  
  250. void Sbar_Init_New (void)
  251. {
  252.   int   i;
  253.  
  254.   for (i=0 ; i<10 ; i++)
  255.   {
  256.     sb_nums[0][i] = Draw_PicFromWad (va("num_%i",i));
  257.     sb_nums[1][i] = Draw_PicFromWad (va("anum_%i",i));
  258.   }
  259.  
  260.   sb_nums[0][10] = Draw_PicFromWad ("num_minus");
  261.   sb_nums[1][10] = Draw_PicFromWad ("anum_minus");
  262.  
  263.   sb_colon = Draw_PicFromWad ("num_colon");
  264.   sb_slash = Draw_PicFromWad ("num_slash");
  265.  
  266.   sb_weapons[0][0] = Draw_PicFromWad ("inv_shotgun");
  267.   sb_weapons[0][1] = Draw_PicFromWad ("inv_sshotgun");
  268.   sb_weapons[0][2] = Draw_PicFromWad ("inv_nailgun");
  269.   sb_weapons[0][3] = Draw_PicFromWad ("inv_snailgun");
  270.   sb_weapons[0][4] = Draw_PicFromWad ("inv_rlaunch");
  271.   sb_weapons[0][5] = Draw_PicFromWad ("inv_srlaunch");
  272.   sb_weapons[0][6] = Draw_PicFromWad ("inv_lightng");
  273.  
  274.   sb_weapons[1][0] = Draw_PicFromWad ("inv2_shotgun");
  275.   sb_weapons[1][1] = Draw_PicFromWad ("inv2_sshotgun");
  276.   sb_weapons[1][2] = Draw_PicFromWad ("inv2_nailgun");
  277.   sb_weapons[1][3] = Draw_PicFromWad ("inv2_snailgun");
  278.   sb_weapons[1][4] = Draw_PicFromWad ("inv2_rlaunch");
  279.   sb_weapons[1][5] = Draw_PicFromWad ("inv2_srlaunch");
  280.   sb_weapons[1][6] = Draw_PicFromWad ("inv2_lightng");
  281.  
  282.   for (i=0 ; i<5 ; i++)
  283.   {
  284.     sb_weapons[2+i][0] = Draw_PicFromWad (va("inva%i_shotgun",i+1));
  285.     sb_weapons[2+i][1] = Draw_PicFromWad (va("inva%i_sshotgun",i+1));
  286.     sb_weapons[2+i][2] = Draw_PicFromWad (va("inva%i_nailgun",i+1));
  287.     sb_weapons[2+i][3] = Draw_PicFromWad (va("inva%i_snailgun",i+1));
  288.     sb_weapons[2+i][4] = Draw_PicFromWad (va("inva%i_rlaunch",i+1));
  289.     sb_weapons[2+i][5] = Draw_PicFromWad (va("inva%i_srlaunch",i+1));
  290.     sb_weapons[2+i][6] = Draw_PicFromWad (va("inva%i_lightng",i+1));
  291.   }
  292.  
  293.   sb_ammo[0] = Draw_PicFromWad ("sb_shells");
  294.   sb_ammo[1] = Draw_PicFromWad ("sb_nails");
  295.   sb_ammo[2] = Draw_PicFromWad ("sb_rocket");
  296.   sb_ammo[3] = Draw_PicFromWad ("sb_cells");
  297.  
  298.   sb_armor[0] = Draw_PicFromWad ("sb_armor1");
  299.   sb_armor[1] = Draw_PicFromWad ("sb_armor2");
  300.   sb_armor[2] = Draw_PicFromWad ("sb_armor3");
  301.  
  302.   sb_items[0] = Draw_PicFromWad ("sb_key1");
  303.   sb_items[1] = Draw_PicFromWad ("sb_key2");
  304.   sb_items[2] = Draw_PicFromWad ("sb_invis");
  305.   sb_items[3] = Draw_PicFromWad ("sb_invuln");
  306.   sb_items[4] = Draw_PicFromWad ("sb_suit");
  307.   sb_items[5] = Draw_PicFromWad ("sb_quad");
  308.  
  309.   sb_sigil[0] = Draw_PicFromWad ("sb_sigil1");
  310.   sb_sigil[1] = Draw_PicFromWad ("sb_sigil2");
  311.   sb_sigil[2] = Draw_PicFromWad ("sb_sigil3");
  312.   sb_sigil[3] = Draw_PicFromWad ("sb_sigil4");
  313.  
  314.   sb_faces[4][0] = Draw_PicFromWad ("face1");
  315.   sb_faces[4][1] = Draw_PicFromWad ("face_p1");
  316.   sb_faces[3][0] = Draw_PicFromWad ("face2");
  317.   sb_faces[3][1] = Draw_PicFromWad ("face_p2");
  318.   sb_faces[2][0] = Draw_PicFromWad ("face3");
  319.   sb_faces[2][1] = Draw_PicFromWad ("face_p3");
  320.   sb_faces[1][0] = Draw_PicFromWad ("face4");
  321.   sb_faces[1][1] = Draw_PicFromWad ("face_p4");
  322.   sb_faces[0][0] = Draw_PicFromWad ("face5");
  323.   sb_faces[0][1] = Draw_PicFromWad ("face_p5");
  324.  
  325.   sb_face_invis = Draw_PicFromWad ("face_invis");
  326.   sb_face_invuln = Draw_PicFromWad ("face_invul2");
  327.   sb_face_invis_invuln = Draw_PicFromWad ("face_inv2");
  328.   sb_face_quad = Draw_PicFromWad ("face_quad");
  329.  
  330. //  Cmd_AddCommand ("+showscores", Sbar_ShowScores);
  331. //  Cmd_AddCommand ("-showscores", Sbar_DontShowScores);
  332.  
  333.   sb_sbar = Draw_PicFromWad ("sbar");
  334.   sb_ibar = Draw_PicFromWad ("ibar");
  335.   sb_scorebar = Draw_PicFromWad ("scorebar");
  336.  
  337. //MED 01/04/97 added new hipnotic weapons
  338.   if (hipnotic)
  339.   {
  340.     hsb_weapons[0][0] = Draw_PicFromWad ("inv_laser");
  341.     hsb_weapons[0][1] = Draw_PicFromWad ("inv_mjolnir");
  342.     hsb_weapons[0][2] = Draw_PicFromWad ("inv_gren_prox");
  343.     hsb_weapons[0][3] = Draw_PicFromWad ("inv_prox_gren");
  344.     hsb_weapons[0][4] = Draw_PicFromWad ("inv_prox");
  345.  
  346.     hsb_weapons[1][0] = Draw_PicFromWad ("inv2_laser");
  347.     hsb_weapons[1][1] = Draw_PicFromWad ("inv2_mjolnir");
  348.     hsb_weapons[1][2] = Draw_PicFromWad ("inv2_gren_prox");
  349.     hsb_weapons[1][3] = Draw_PicFromWad ("inv2_prox_gren");
  350.     hsb_weapons[1][4] = Draw_PicFromWad ("inv2_prox");
  351.  
  352.     for (i=0 ; i<5 ; i++)
  353.     {
  354.      hsb_weapons[2+i][0] = Draw_PicFromWad (va("inva%i_laser",i+1));
  355.      hsb_weapons[2+i][1] = Draw_PicFromWad (va("inva%i_mjolnir",i+1));
  356.      hsb_weapons[2+i][2] = Draw_PicFromWad (va("inva%i_gren_prox",i+1));
  357.      hsb_weapons[2+i][3] = Draw_PicFromWad (va("inva%i_prox_gren",i+1));
  358.      hsb_weapons[2+i][4] = Draw_PicFromWad (va("inva%i_prox",i+1));
  359.     }
  360.  
  361.     hsb_items[0] = Draw_PicFromWad ("sb_wsuit");
  362.     hsb_items[1] = Draw_PicFromWad ("sb_eshld");
  363.   }
  364.  
  365.   if (rogue)
  366.   {
  367.     rsb_invbar[0] = Draw_PicFromWad ("r_invbar1");
  368.     rsb_invbar[1] = Draw_PicFromWad ("r_invbar2");
  369.  
  370.     rsb_weapons[0] = Draw_PicFromWad ("r_lava");
  371.     rsb_weapons[1] = Draw_PicFromWad ("r_superlava");
  372.     rsb_weapons[2] = Draw_PicFromWad ("r_gren");
  373.     rsb_weapons[3] = Draw_PicFromWad ("r_multirock");
  374.     rsb_weapons[4] = Draw_PicFromWad ("r_plasma");
  375.  
  376.     rsb_items[0] = Draw_PicFromWad ("r_shield1");
  377.         rsb_items[1] = Draw_PicFromWad ("r_agrav1");
  378.  
  379. // PGM 01/19/97 - team color border
  380.         rsb_teambord = Draw_PicFromWad ("r_teambord");
  381. // PGM 01/19/97 - team color border
  382.  
  383.     rsb_ammo[0] = Draw_PicFromWad ("r_ammolava");
  384.     rsb_ammo[1] = Draw_PicFromWad ("r_ammomulti");
  385.     rsb_ammo[2] = Draw_PicFromWad ("r_ammoplasma");
  386.   }
  387. }
  388.  
  389. //=============================================================================
  390.  
  391. // drawing routines are relative to the status bar location
  392.  
  393. /*
  394. =============
  395. Sbar_DrawPic
  396. =============
  397. */
  398. void Sbar_DrawPic (int x, int y, qpic_t *pic)
  399. {
  400.   if (cl.gametype == GAME_DEATHMATCH)
  401.     Draw_Pic (x /* + ((vid.width - 320)>>1)*/, y + (vid.height-SBAR_HEIGHT), pic);
  402.   else
  403.     Draw_Pic (x + ((vid.width - 320)>>1), y + (vid.height-SBAR_HEIGHT), pic);
  404. }
  405.  
  406. /*
  407. =============
  408. Sbar_DrawTransPic
  409. =============
  410. */
  411. void Sbar_DrawTransPic (int x, int y, qpic_t *pic)
  412. {
  413.   if (cl.gametype == GAME_DEATHMATCH)
  414.     Draw_TransPic (x /*+ ((vid.width - 320)>>1)*/, y + (vid.height-SBAR_HEIGHT), pic);
  415.   else
  416.     Draw_TransPic (x + ((vid.width - 320)>>1), y + (vid.height-SBAR_HEIGHT), pic);
  417. }
  418.  
  419. /*
  420. ================
  421. Sbar_DrawCharacter
  422.  
  423. Draws one solid graphics character
  424. ================
  425. */
  426. void Sbar_DrawCharacter (int x, int y, int num)
  427. {
  428.   if (cl.gametype == GAME_DEATHMATCH)
  429.     Draw_Character ( x /*+ ((vid.width - 320)>>1) */ + 4 , y + vid.height-SBAR_HEIGHT, num);
  430.   else
  431.     Draw_Character ( x + ((vid.width - 320)>>1) + 4 , y + vid.height-SBAR_HEIGHT, num);
  432. }
  433.  
  434. /*
  435. ================
  436. Sbar_DrawString
  437. ================
  438. */
  439. void Sbar_DrawString (int x, int y, char *str)
  440. {
  441.   if (cl.gametype == GAME_DEATHMATCH)
  442.     Draw_String (x /*+ ((vid.width - 320)>>1)*/, y+ vid.height-SBAR_HEIGHT, str);
  443.   else
  444.     Draw_String (x + ((vid.width - 320)>>1), y+ vid.height-SBAR_HEIGHT, str);
  445. }
  446.  
  447. /*
  448. =============
  449. Sbar_itoa
  450. =============
  451. */
  452. int Sbar_itoa (int num, char *buf)
  453. {
  454.   char  *str;
  455.   int   pow10;
  456.   int   dig;
  457.  
  458.   str = buf;
  459.  
  460.   if (num < 0)
  461.   {
  462.     *str++ = '-';
  463.     num = -num;
  464.   }
  465.  
  466.   for (pow10 = 10 ; num >= pow10 ; pow10 *= 10)
  467.   ;
  468.  
  469.   do
  470.   {
  471.     pow10 /= 10;
  472.     dig = num/pow10;
  473.     *str++ = '0'+dig;
  474.     num -= dig*pow10;
  475.   } while (pow10 != 1);
  476.  
  477.   *str = 0;
  478.  
  479.   return str-buf;
  480. }
  481.  
  482.  
  483. /*
  484. =============
  485. Sbar_DrawNum
  486. =============
  487. */
  488. void Sbar_DrawNum (int x, int y, int num, int digits, int color)
  489. {
  490.   char      str[12];
  491.   char      *ptr;
  492.   int       l, frame;
  493.  
  494.   l = Sbar_itoa (num, str);
  495.   ptr = str;
  496.   if (l > digits)
  497.     ptr += (l-digits);
  498.   if (l < digits)
  499.     x += (digits-l)*24;
  500.  
  501.   while (*ptr)
  502.   {
  503.     if (*ptr == '-')
  504.       frame = STAT_MINUS;
  505.     else
  506.       frame = *ptr -'0';
  507.  
  508.     Sbar_DrawTransPic (x,y,sb_nums[color][frame]);
  509.     x += 24;
  510.     ptr++;
  511.   }
  512. }
  513.  
  514. //=============================================================================
  515.  
  516. int   fragsort[MAX_SCOREBOARD];
  517.  
  518. char  scoreboardtext[MAX_SCOREBOARD][20];
  519. int   scoreboardtop[MAX_SCOREBOARD];
  520. int   scoreboardbottom[MAX_SCOREBOARD];
  521. int   scoreboardcount[MAX_SCOREBOARD];
  522. int   scoreboardlines;
  523.  
  524. /*
  525. ===============
  526. Sbar_SortFrags
  527. ===============
  528. */
  529. void Sbar_SortFrags (void)
  530. {
  531.   int   i, j, k;
  532.  
  533. // sort by frags
  534.   scoreboardlines = 0;
  535.   for (i=0 ; i<cl.maxclients ; i++)
  536.   {
  537.     if (cl.scores[i].name[0])
  538.     {
  539.       fragsort[scoreboardlines] = i;
  540.       scoreboardlines++;
  541.     }
  542.   }
  543.  
  544.   for (i=0 ; i<scoreboardlines ; i++)
  545.     for (j=0 ; j<scoreboardlines-1-i ; j++)
  546.       if (cl.scores[fragsort[j]].frags < cl.scores[fragsort[j+1]].frags)
  547.       {
  548.         k = fragsort[j];
  549.         fragsort[j] = fragsort[j+1];
  550.         fragsort[j+1] = k;
  551.       }
  552. }
  553.  
  554. int Sbar_ColorForMap (int m)
  555. {
  556.   return m < 128 ? m + 8 : m + 8;
  557. }
  558.  
  559. /*
  560. ===============
  561. Sbar_UpdateScoreboard
  562. ===============
  563. */
  564. void Sbar_UpdateScoreboard (void)
  565. {
  566.   int   i, k;
  567.   int   top, bottom;
  568.   scoreboard_t  *s;
  569.  
  570.   Sbar_SortFrags ();
  571.  
  572. // draw the text
  573.   memset (scoreboardtext, 0, sizeof(scoreboardtext));
  574.  
  575.   for (i=0 ; i<scoreboardlines; i++)
  576.   {
  577.     k = fragsort[i];
  578.     s = &cl.scores[k];
  579.     sprintf (&scoreboardtext[i][1], "%3i %s", s->frags, s->name);
  580.  
  581.     top = s->colors & 0xf0;
  582.     bottom = (s->colors & 15) <<4;
  583.     scoreboardtop[i] = Sbar_ColorForMap (top);
  584.     scoreboardbottom[i] = Sbar_ColorForMap (bottom);
  585.   }
  586. }
  587.  
  588.  
  589.  
  590. /*
  591. ===============
  592. Sbar_SoloScoreboard
  593. ===============
  594. */
  595. void Sbar_SoloScoreboard (void)
  596. {
  597.   char  str[80];
  598.   int   minutes, seconds, tens, units;
  599.   int   l;
  600.  
  601.   sprintf (str,"Monsters:%3i /%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS]);
  602.   Sbar_DrawString (8, 4, str);
  603.  
  604.   sprintf (str,"Secrets :%3i /%3i", cl.stats[STAT_SECRETS], cl.stats[STAT_TOTALSECRETS]);
  605.   Sbar_DrawString (8, 12, str);
  606.  
  607. // time
  608.   minutes = cl.time / 60;
  609.   seconds = cl.time - 60*minutes;
  610.   tens = seconds / 10;
  611.   units = seconds - 10*tens;
  612.   sprintf (str,"Time :%3i:%i%i", minutes, tens, units);
  613.   Sbar_DrawString (184, 4, str);
  614.  
  615. // draw level name
  616.   l = strlen (cl.levelname);
  617.   Sbar_DrawString (232 - l*4, 12, cl.levelname);
  618. }
  619.  
  620. /*
  621. ===============
  622. Sbar_DrawScoreboard
  623. ===============
  624. */
  625. void Sbar_DrawScoreboard (void)
  626. {
  627.   Sbar_SoloScoreboard ();
  628.   if (cl.gametype == GAME_DEATHMATCH)
  629.     Sbar_DeathmatchOverlay ();
  630. #if 0
  631.   int   i, j, c;
  632.   int   x, y;
  633.   int   l;
  634.   int   top, bottom;
  635.   scoreboard_t  *s;
  636.  
  637.   if (cl.gametype != GAME_DEATHMATCH)
  638.   {
  639.     Sbar_SoloScoreboard ();
  640.     return;
  641.   }
  642.  
  643.   Sbar_UpdateScoreboard ();
  644.  
  645.   l = scoreboardlines <= 6 ? scoreboardlines : 6;
  646.  
  647.   for (i=0 ; i<l ; i++)
  648.   {
  649.     x = 20*(i&1);
  650.     y = i/2 * 8;
  651.  
  652.     s = &cl.scores[fragsort[i]];
  653.     if (!s->name[0])
  654.       continue;
  655.  
  656.   // draw background
  657.     top = s->colors & 0xf0;
  658.     bottom = (s->colors & 15)<<4;
  659.     top = Sbar_ColorForMap (top);
  660.     bottom = Sbar_ColorForMap (bottom);
  661.  
  662.     Draw_Fill ( x*8+10 + ((vid.width - 320)>>1), y + vid.height - SBAR_HEIGHT, 28, 4, top);
  663.     Draw_Fill ( x*8+10 + ((vid.width - 320)>>1), y+4 + vid.height - SBAR_HEIGHT, 28, 4, bottom);
  664.  
  665.   // draw text
  666.     for (j=0 ; j<20 ; j++)
  667.     {
  668.       c = scoreboardtext[i][j];
  669.       if (c == 0 || c == ' ')
  670.         continue;
  671.       Sbar_DrawCharacter ( (x+j)*8, y, c);
  672.     }
  673.   }
  674. #endif
  675. }
  676.  
  677. //=============================================================================
  678.  
  679. /*
  680. ===============
  681. Sbar_DrawInventory
  682. ===============
  683. */
  684. void Sbar_DrawInventory (void)
  685. {
  686.   int   i;
  687.   char  num[6];
  688.   float time;
  689.   int   flashon;
  690.  
  691.   if (rogue)
  692.   {
  693.     if ( cl.stats[STAT_ACTIVEWEAPON] >= RIT_LAVA_NAILGUN )
  694.       Sbar_DrawPic (0, -24, rsb_invbar[0]);
  695.     else
  696.       Sbar_DrawPic (0, -24, rsb_invbar[1]);
  697.   }
  698.   else
  699.   {
  700.     Sbar_DrawPic (0, -24, sb_ibar);
  701.   }
  702.  
  703. // weapons
  704.   for (i=0 ; i<7 ; i++)
  705.   {
  706.     if (cl.items & (IT_SHOTGUN<<i) )
  707.     {
  708.       time = cl.item_gettime[i];
  709.       flashon = (int)((cl.time - time)*10);
  710.       if (flashon >= 10)
  711.       {
  712.         if ( cl.stats[STAT_ACTIVEWEAPON] == (IT_SHOTGUN<<i)  )
  713.           flashon = 1;
  714.         else
  715.           flashon = 0;
  716.       }
  717.       else
  718.         flashon = (flashon%5) + 2;
  719.  
  720.          Sbar_DrawPic (i*24, -16, sb_weapons[flashon][i]);
  721.  
  722.       if (flashon > 1)
  723.         sb_updates = 0;   // force update to remove flash
  724.     }
  725.   }
  726.  
  727. // MED 01/04/97
  728. // hipnotic weapons
  729.     if (hipnotic)
  730.     {
  731.       int grenadeflashing=0;
  732.       for (i=0 ; i<4 ; i++)
  733.       {
  734.          if (cl.items & (1<<hipweapons[i]) )
  735.          {
  736.             time = cl.item_gettime[hipweapons[i]];
  737.             flashon = (int)((cl.time - time)*10);
  738.             if (flashon >= 10)
  739.             {
  740.                if ( cl.stats[STAT_ACTIVEWEAPON] == (1<<hipweapons[i])  )
  741.                   flashon = 1;
  742.                else
  743.                   flashon = 0;
  744.             }
  745.             else
  746.                flashon = (flashon%5) + 2;
  747.  
  748.             // check grenade launcher
  749.             if (i==2)
  750.             {
  751.                if (cl.items & HIT_PROXIMITY_GUN)
  752.                {
  753.                   if (flashon)
  754.                   {
  755.                      grenadeflashing = 1;
  756.                      Sbar_DrawPic (96, -16, hsb_weapons[flashon][2]);
  757.                   }
  758.                }
  759.             }
  760.             else if (i==3)
  761.             {
  762.                if (cl.items & (IT_SHOTGUN<<4))
  763.                {
  764.                   if (flashon && !grenadeflashing)
  765.                   {
  766.                      Sbar_DrawPic (96, -16, hsb_weapons[flashon][3]);
  767.                   }
  768.                   else if (!grenadeflashing)
  769.                   {
  770.                      Sbar_DrawPic (96, -16, hsb_weapons[0][3]);
  771.                   }
  772.                }
  773.                else
  774.                   Sbar_DrawPic (96, -16, hsb_weapons[flashon][4]);
  775.             }
  776.             else
  777.                Sbar_DrawPic (176 + (i*24), -16, hsb_weapons[flashon][i]);
  778.             if (flashon > 1)
  779.                sb_updates = 0;      // force update to remove flash
  780.          }
  781.       }
  782.     }
  783.  
  784.   if (rogue)
  785.   {
  786.     // check for powered up weapon.
  787.     if ( cl.stats[STAT_ACTIVEWEAPON] >= RIT_LAVA_NAILGUN )
  788.     {
  789.       for (i=0;i<5;i++)
  790.       {
  791.         if (cl.stats[STAT_ACTIVEWEAPON] == (RIT_LAVA_NAILGUN << i))
  792.         {
  793.           Sbar_DrawPic ((i+2)*24, -16, rsb_weapons[i]);
  794.         }
  795.       }
  796.     }
  797.   }
  798.  
  799. // ammo counts
  800.   for (i=0 ; i<4 ; i++)
  801.   {
  802.     sprintf (num, "%3i",cl.stats[STAT_SHELLS+i] );
  803.     if (num[0] != ' ')
  804.       Sbar_DrawCharacter ( (6*i+1)*8 - 2, -24, 18 + num[0] - '0');
  805.     if (num[1] != ' ')
  806.       Sbar_DrawCharacter ( (6*i+2)*8 - 2, -24, 18 + num[1] - '0');
  807.     if (num[2] != ' ')
  808.       Sbar_DrawCharacter ( (6*i+3)*8 - 2, -24, 18 + num[2] - '0');
  809.   }
  810.  
  811.   flashon = 0;
  812.    // items
  813.    for (i=0 ; i<6 ; i++)
  814.       if (cl.items & (1<<(17+i)))
  815.       {
  816.          time = cl.item_gettime[17+i];
  817.          if (time && time > cl.time - 2 && flashon )
  818.          {  // flash frame
  819.             sb_updates = 0;
  820.          }
  821.          else
  822.          {
  823.          //MED 01/04/97 changed keys
  824.             if (!hipnotic || (i>1))
  825.             {
  826.                Sbar_DrawPic (192 + i*16, -16, sb_items[i]);
  827.             }
  828.          }
  829.          if (time && time > cl.time - 2)
  830.             sb_updates = 0;
  831.       }
  832.    //MED 01/04/97 added hipnotic items
  833.    // hipnotic items
  834.    if (hipnotic)
  835.    {
  836.       for (i=0 ; i<2 ; i++)
  837.          if (cl.items & (1<<(24+i)))
  838.          {
  839.             time = cl.item_gettime[24+i];
  840.             if (time && time > cl.time - 2 && flashon )
  841.             {  // flash frame
  842.                sb_updates = 0;
  843.             }
  844.             else
  845.             {
  846.                Sbar_DrawPic (288 + i*16, -16, hsb_items[i]);
  847.             }
  848.             if (time && time > cl.time - 2)
  849.                sb_updates = 0;
  850.          }
  851.    }
  852.  
  853.   if (rogue)
  854.   {
  855.   // new rogue items
  856.     for (i=0 ; i<2 ; i++)
  857.     {
  858.       if (cl.items & (1<<(29+i)))
  859.       {
  860.         time = cl.item_gettime[29+i];
  861.  
  862.         if (time && time > cl.time - 2 && flashon )
  863.         { // flash frame
  864.           sb_updates = 0;
  865.         }
  866.         else
  867.         {
  868.           Sbar_DrawPic (288 + i*16, -16, rsb_items[i]);
  869.         }
  870.  
  871.         if (time && time > cl.time - 2)
  872.           sb_updates = 0;
  873.       }
  874.     }
  875.   }
  876.   else
  877.   {
  878.   // sigils
  879.     for (i=0 ; i<4 ; i++)
  880.     {
  881.       if (cl.items & (1<<(28+i)))
  882.       {
  883.         time = cl.item_gettime[28+i];
  884.         if (time && time > cl.time - 2 && flashon )
  885.         { // flash frame
  886.           sb_updates = 0;
  887.         }
  888.         else
  889.           Sbar_DrawPic (320-32 + i*8, -16, sb_sigil[i]);
  890.         if (time && time > cl.time - 2)
  891.           sb_updates = 0;
  892.       }
  893.     }
  894.   }
  895. }
  896.  
  897. //=============================================================================
  898.  
  899. /*
  900. ===============
  901. Sbar_DrawFrags
  902. ===============
  903. */
  904. void Sbar_DrawFrags (void)
  905. {
  906.   int       i, k, l;
  907.   int       top, bottom;
  908.   int       x, y, f;
  909.   int       xofs;
  910.   char      num[12];
  911.   scoreboard_t  *s;
  912.  
  913.   Sbar_SortFrags ();
  914.  
  915. // draw the text
  916.   l = scoreboardlines <= 4 ? scoreboardlines : 4;
  917.  
  918.   x = 23;
  919.   if (cl.gametype == GAME_DEATHMATCH)
  920.     xofs = 0;
  921.   else
  922.     xofs = (vid.width - 320)>>1;
  923.   y = vid.height - SBAR_HEIGHT - 23;
  924.  
  925.   for (i=0 ; i<l ; i++)
  926.   {
  927.     k = fragsort[i];
  928.     s = &cl.scores[k];
  929.     if (!s->name[0])
  930.       continue;
  931.  
  932.   // draw background
  933.     top = s->colors & 0xf0;
  934.     bottom = (s->colors & 15)<<4;
  935.     top = Sbar_ColorForMap (top);
  936.     bottom = Sbar_ColorForMap (bottom);
  937.  
  938.     Draw_Fill (xofs + x*8 + 10, y, 28, 4, top);
  939.     Draw_Fill (xofs + x*8 + 10, y+4, 28, 3, bottom);
  940.  
  941.   // draw number
  942.     f = s->frags;
  943.     sprintf (num, "%3i",f);
  944.  
  945.     Sbar_DrawCharacter ( (x+1)*8 , -24, num[0]);
  946.     Sbar_DrawCharacter ( (x+2)*8 , -24, num[1]);
  947.     Sbar_DrawCharacter ( (x+3)*8 , -24, num[2]);
  948.  
  949.     if (k == cl.viewentity - 1)
  950.     {
  951.       Sbar_DrawCharacter (x*8+2, -24, 16);
  952.       Sbar_DrawCharacter ( (x+4)*8-4, -24, 17);
  953.     }
  954.     x+=4;
  955.   }
  956. }
  957.  
  958. //=============================================================================
  959.  
  960.  
  961. /*
  962. ===============
  963. Sbar_DrawFace
  964. ===============
  965. */
  966. void Sbar_DrawFace (void)
  967. {
  968.   int   f, anim;
  969.  
  970. // PGM 01/19/97 - team color drawing
  971. // PGM 03/02/97 - fixed so color swatch only appears in CTF modes
  972.   if (rogue &&
  973.         (cl.maxclients != 1) &&
  974.         (teamplay.value>3) &&
  975.         (teamplay.value<7))
  976.   {
  977.     int       top, bottom;
  978.     int       xofs;
  979.     char      num[12];
  980.     scoreboard_t  *s;
  981.     
  982.     s = &cl.scores[cl.viewentity - 1];
  983.     // draw background
  984.     top = s->colors & 0xf0;
  985.     bottom = (s->colors & 15)<<4;
  986.     top = Sbar_ColorForMap (top);
  987.     bottom = Sbar_ColorForMap (bottom);
  988.  
  989.     if (cl.gametype == GAME_DEATHMATCH)
  990.       xofs = 113;
  991.     else
  992.       xofs = ((vid.width - 320)>>1) + 113;
  993.  
  994.     Sbar_DrawPic (112, 0, rsb_teambord);
  995.     Draw_Fill (xofs, vid.height-SBAR_HEIGHT+3, 22, 9, top);
  996.     Draw_Fill (xofs, vid.height-SBAR_HEIGHT+12, 22, 9, bottom);
  997.  
  998.     // draw number
  999.     f = s->frags;
  1000.     sprintf (num, "%3i",f);
  1001.  
  1002.     if (top==8)
  1003.     {
  1004.       if (num[0] != ' ')
  1005.         Sbar_DrawCharacter(109, 3, 18 + num[0] - '0');
  1006.       if (num[1] != ' ')
  1007.         Sbar_DrawCharacter(116, 3, 18 + num[1] - '0');
  1008.       if (num[2] != ' ')
  1009.         Sbar_DrawCharacter(123, 3, 18 + num[2] - '0');
  1010.     }
  1011.     else
  1012.     {
  1013.       Sbar_DrawCharacter ( 109, 3, num[0]);
  1014.       Sbar_DrawCharacter ( 116, 3, num[1]);
  1015.       Sbar_DrawCharacter ( 123, 3, num[2]);
  1016.     }
  1017.     
  1018.     return;
  1019.   }
  1020. // PGM 01/19/97 - team color drawing
  1021.  
  1022.   if ( (cl.items & (IT_INVISIBILITY | IT_INVULNERABILITY) )
  1023.   == (IT_INVISIBILITY | IT_INVULNERABILITY) )
  1024.   {
  1025.     Sbar_DrawPic (112, 0, sb_face_invis_invuln);
  1026.     return;
  1027.   }
  1028.   if (cl.items & IT_QUAD)
  1029.   {
  1030.     Sbar_DrawPic (112, 0, sb_face_quad );
  1031.     return;
  1032.   }
  1033.   if (cl.items & IT_INVISIBILITY)
  1034.   {
  1035.     Sbar_DrawPic (112, 0, sb_face_invis );
  1036.     return;
  1037.   }
  1038.   if (cl.items & IT_INVULNERABILITY)
  1039.   {
  1040.     Sbar_DrawPic (112, 0, sb_face_invuln);
  1041.     return;
  1042.   }
  1043.  
  1044.   if (cl.stats[STAT_HEALTH] >= 100)
  1045.     f = 4;
  1046.   else
  1047.     f = cl.stats[STAT_HEALTH] / 20;
  1048.  
  1049.   if (cl.time <= cl.faceanimtime)
  1050.   {
  1051.     anim = 1;
  1052.     sb_updates = 0;   // make sure the anim gets drawn over
  1053.   }
  1054.   else
  1055.     anim = 0;
  1056.   Sbar_DrawPic (112, 0, sb_faces[f][anim]);
  1057. }
  1058.  
  1059. /*
  1060. ===============
  1061. Sbar_Draw
  1062. ===============
  1063. */
  1064. void Sbar_Draw (void)
  1065. {
  1066.   if (scr_con_current == vid.height)
  1067.     return;   // console is full screen
  1068.  
  1069.   if (sb_updates >= vid.numpages)
  1070.     return;
  1071.  
  1072.   scr_copyeverything = 1;
  1073.  
  1074.   sb_updates++;
  1075.  
  1076.   if (sb_lines && vid.width > 320) 
  1077.     Draw_TileClear (0, vid.height - sb_lines, vid.width, sb_lines);
  1078.  
  1079.   if (sb_lines > 24)
  1080.   {
  1081.     Sbar_DrawInventory ();
  1082.     if (cl.maxclients != 1)
  1083.       Sbar_DrawFrags ();
  1084.   }
  1085.  
  1086.   if (sb_showscores || cl.stats[STAT_HEALTH] <= 0)
  1087.   {
  1088.     Sbar_DrawPic (0, 0, sb_scorebar);
  1089.     Sbar_DrawScoreboard ();
  1090.     sb_updates = 0;
  1091.   }
  1092.   else if (sb_lines)
  1093.   {
  1094.     Sbar_DrawPic (0, 0, sb_sbar);
  1095.  
  1096.    // keys (hipnotic only)
  1097.       //MED 01/04/97 moved keys here so they would not be overwritten
  1098.       if (hipnotic)
  1099.       {
  1100.          if (cl.items & IT_KEY1)
  1101.             Sbar_DrawPic (209, 3, sb_items[0]);
  1102.          if (cl.items & IT_KEY2)
  1103.             Sbar_DrawPic (209, 12, sb_items[1]);
  1104.       }
  1105.    // armor
  1106.     if (cl.items & IT_INVULNERABILITY)
  1107.     {
  1108.       Sbar_DrawNum (24, 0, 666, 3, 1);
  1109.       Sbar_DrawPic (0, 0, draw_disc);
  1110.     }
  1111.     else
  1112.     {
  1113.       if (rogue)
  1114.       {
  1115.         Sbar_DrawNum (24, 0, cl.stats[STAT_ARMOR], 3,
  1116.                 cl.stats[STAT_ARMOR] <= 25);
  1117.         if (cl.items & RIT_ARMOR3)
  1118.           Sbar_DrawPic (0, 0, sb_armor[2]);
  1119.         else if (cl.items & RIT_ARMOR2)
  1120.           Sbar_DrawPic (0, 0, sb_armor[1]);
  1121.         else if (cl.items & RIT_ARMOR1)
  1122.           Sbar_DrawPic (0, 0, sb_armor[0]);
  1123.       }
  1124.       else
  1125.       {
  1126.         Sbar_DrawNum (24, 0, cl.stats[STAT_ARMOR], 3
  1127.         , cl.stats[STAT_ARMOR] <= 25);
  1128.         if (cl.items & IT_ARMOR3)
  1129.           Sbar_DrawPic (0, 0, sb_armor[2]);
  1130.         else if (cl.items & IT_ARMOR2)
  1131.           Sbar_DrawPic (0, 0, sb_armor[1]);
  1132.         else if (cl.items & IT_ARMOR1)
  1133.           Sbar_DrawPic (0, 0, sb_armor[0]);
  1134.       }
  1135.     }
  1136.  
  1137.   // face
  1138.     Sbar_DrawFace ();
  1139.  
  1140.   // health
  1141.     Sbar_DrawNum (136, 0, cl.stats[STAT_HEALTH], 3
  1142.     , cl.stats[STAT_HEALTH] <= 25);
  1143.  
  1144.   // ammo icon
  1145.     if (rogue)
  1146.     {
  1147.       if (cl.items & RIT_SHELLS)
  1148.         Sbar_DrawPic (224, 0, sb_ammo[0]);
  1149.       else if (cl.items & RIT_NAILS)
  1150.         Sbar_DrawPic (224, 0, sb_ammo[1]);
  1151.       else if (cl.items & RIT_ROCKETS)
  1152.         Sbar_DrawPic (224, 0, sb_ammo[2]);
  1153.       else if (cl.items & RIT_CELLS)
  1154.         Sbar_DrawPic (224, 0, sb_ammo[3]);
  1155.       else if (cl.items & RIT_LAVA_NAILS)
  1156.         Sbar_DrawPic (224, 0, rsb_ammo[0]);
  1157.       else if (cl.items & RIT_PLASMA_AMMO)
  1158.         Sbar_DrawPic (224, 0, rsb_ammo[1]);
  1159.       else if (cl.items & RIT_MULTI_ROCKETS)
  1160.         Sbar_DrawPic (224, 0, rsb_ammo[2]);
  1161.     }
  1162.     else
  1163.     {
  1164.       if (cl.items & IT_SHELLS)
  1165.         Sbar_DrawPic (224, 0, sb_ammo[0]);
  1166.       else if (cl.items & IT_NAILS)
  1167.         Sbar_DrawPic (224, 0, sb_ammo[1]);
  1168.       else if (cl.items & IT_ROCKETS)
  1169.         Sbar_DrawPic (224, 0, sb_ammo[2]);
  1170.       else if (cl.items & IT_CELLS)
  1171.         Sbar_DrawPic (224, 0, sb_ammo[3]);
  1172.     }
  1173.  
  1174.     Sbar_DrawNum (248, 0, cl.stats[STAT_AMMO], 3,
  1175.             cl.stats[STAT_AMMO] <= 10);
  1176.   }
  1177.  
  1178.   if (vid.width > 320) {
  1179.     if (cl.gametype == GAME_DEATHMATCH)
  1180.       Sbar_MiniDeathmatchOverlay ();
  1181.   }
  1182. }
  1183.  
  1184. //=============================================================================
  1185.  
  1186. /*
  1187. ==================
  1188. Sbar_IntermissionNumber
  1189.  
  1190. ==================
  1191. */
  1192. void Sbar_IntermissionNumber (int x, int y, int num, int digits, int color)
  1193. {
  1194.   char      str[12];
  1195.   char      *ptr;
  1196.   int       l, frame;
  1197.  
  1198.   l = Sbar_itoa (num, str);
  1199.   ptr = str;
  1200.   if (l > digits)
  1201.     ptr += (l-digits);
  1202.   if (l < digits)
  1203.     x += (digits-l)*24;
  1204.  
  1205.   while (*ptr)
  1206.   {
  1207.     if (*ptr == '-')
  1208.       frame = STAT_MINUS;
  1209.     else
  1210.       frame = *ptr -'0';
  1211.  
  1212.     Draw_TransPic (x,y,sb_nums[color][frame]);
  1213.     x += 24;
  1214.     ptr++;
  1215.   }
  1216. }
  1217.  
  1218. /*
  1219. ==================
  1220. Sbar_DeathmatchOverlay
  1221.  
  1222. ==================
  1223. */
  1224. void Sbar_DeathmatchOverlay (void)
  1225. {
  1226.   qpic_t      *pic;
  1227.   int       i, k, l;
  1228.   int       top, bottom;
  1229.   int       x, y, f;
  1230.   char      num[12];
  1231.   scoreboard_t  *s;
  1232.  
  1233.   scr_copyeverything = 1;
  1234.   scr_fullupdate = 0;
  1235.  
  1236.   pic = Draw_CachePic ("gfx/ranking.lmp");
  1237.   M_DrawPic ((320-pic->width)/2, 8, pic);
  1238.  
  1239. // scores
  1240.   Sbar_SortFrags ();
  1241.  
  1242. // draw the text
  1243.   l = scoreboardlines;
  1244.  
  1245.   x = 80 + ((vid.width - 320)>>1);
  1246.   y = 40;
  1247.   for (i=0 ; i<l ; i++)
  1248.   {
  1249.     k = fragsort[i];
  1250.     s = &cl.scores[k];
  1251.     if (!s->name[0])
  1252.       continue;
  1253.  
  1254.   // draw background
  1255.     top = s->colors & 0xf0;
  1256.     bottom = (s->colors & 15)<<4;
  1257.     top = Sbar_ColorForMap (top);
  1258.     bottom = Sbar_ColorForMap (bottom);
  1259.  
  1260.     Draw_Fill ( x, y, 40, 4, top);
  1261.     Draw_Fill ( x, y+4, 40, 4, bottom);
  1262.  
  1263.   // draw number
  1264.     f = s->frags;
  1265.     sprintf (num, "%3i",f);
  1266.  
  1267.     Draw_Character ( x+8 , y, num[0]);
  1268.     Draw_Character ( x+16 , y, num[1]);
  1269.     Draw_Character ( x+24 , y, num[2]);
  1270.  
  1271.     if (k == cl.viewentity - 1)
  1272.       Draw_Character ( x - 8, y, 12);
  1273.  
  1274. #if 0
  1275. {
  1276.   int       total;
  1277.   int       n, minutes, tens, units;
  1278.  
  1279.   // draw time
  1280.     total = cl.completed_time - s->entertime;
  1281.     minutes = (int)total/60;
  1282.     n = total - minutes*60;
  1283.     tens = n/10;
  1284.     units = n%10;
  1285.  
  1286.     sprintf (num, "%3i:%i%i", minutes, tens, units);
  1287.  
  1288.     Draw_String ( x+48 , y, num);
  1289. }
  1290. #endif
  1291.  
  1292.   // draw name
  1293.     Draw_String (x+64, y, s->name);
  1294.  
  1295.     y += 10;
  1296.   }
  1297. }
  1298.  
  1299. /*
  1300. ==================
  1301. Sbar_DeathmatchOverlay
  1302.  
  1303. ==================
  1304. */
  1305. void Sbar_MiniDeathmatchOverlay (void)
  1306. {
  1307.   qpic_t      *pic;
  1308.   int       i, k, l;
  1309.   int       top, bottom;
  1310.   int       x, y, f;
  1311.   char      num[12];
  1312.   scoreboard_t  *s;
  1313.   int       numlines;
  1314.  
  1315.   if (vid.width < 512 || !sb_lines)
  1316.     return;
  1317.  
  1318.   scr_copyeverything = 1;
  1319.   scr_fullupdate = 0;
  1320.  
  1321. // scores
  1322.   Sbar_SortFrags ();
  1323.  
  1324. // draw the text
  1325.   l = scoreboardlines;
  1326.   y = vid.height - sb_lines;
  1327.   numlines = sb_lines/8;
  1328.   if (numlines < 3)
  1329.     return;
  1330.  
  1331.   //find us
  1332.   for (i = 0; i < scoreboardlines; i++)
  1333.     if (fragsort[i] == cl.viewentity - 1)
  1334.       break;
  1335.  
  1336.     if (i == scoreboardlines) // we're not there
  1337.             i = 0;
  1338.     else // figure out start
  1339.             i = i - numlines/2;
  1340.  
  1341.     if (i > scoreboardlines - numlines)
  1342.             i = scoreboardlines - numlines;
  1343.     if (i < 0)
  1344.             i = 0;
  1345.  
  1346.   x = 324;
  1347.   for (/* */; i < scoreboardlines && y < vid.height - 8 ; i++)
  1348.   {
  1349.     k = fragsort[i];
  1350.     s = &cl.scores[k];
  1351.     if (!s->name[0])
  1352.       continue;
  1353.  
  1354.   // draw background
  1355.     top = s->colors & 0xf0;
  1356.     bottom = (s->colors & 15)<<4;
  1357.     top = Sbar_ColorForMap (top);
  1358.     bottom = Sbar_ColorForMap (bottom);
  1359.  
  1360.     Draw_Fill ( x, y+1, 40, 3, top);
  1361.     Draw_Fill ( x, y+4, 40, 4, bottom);
  1362.  
  1363.   // draw number
  1364.     f = s->frags;
  1365.     sprintf (num, "%3i",f);
  1366.  
  1367.     Draw_Character ( x+8 , y, num[0]);
  1368.     Draw_Character ( x+16 , y, num[1]);
  1369.     Draw_Character ( x+24 , y, num[2]);
  1370.  
  1371.     if (k == cl.viewentity - 1) {
  1372.       Draw_Character ( x, y, 16);
  1373.       Draw_Character ( x + 32, y, 17);
  1374.     }
  1375.  
  1376. #if 0
  1377. {
  1378.   int       total;
  1379.   int       n, minutes, tens, units;
  1380.  
  1381.   // draw time
  1382.     total = cl.completed_time - s->entertime;
  1383.     minutes = (int)total/60;
  1384.     n = total - minutes*60;
  1385.     tens = n/10;
  1386.     units = n%10;
  1387.  
  1388.     sprintf (num, "%3i:%i%i", minutes, tens, units);
  1389.  
  1390.     Draw_String ( x+48 , y, num);
  1391. }
  1392. #endif
  1393.  
  1394.   // draw name
  1395.     Draw_String (x+48, y, s->name);
  1396.  
  1397.     y += 8;
  1398.   }
  1399. }
  1400.  
  1401. /*
  1402. ==================
  1403. Sbar_IntermissionOverlay
  1404.  
  1405. ==================
  1406. */
  1407. void Sbar_IntermissionOverlay (void)
  1408. {
  1409.   qpic_t  *pic;
  1410.   int   dig;
  1411.   int   num;
  1412.  
  1413.   scr_copyeverything = 1;
  1414.   scr_fullupdate = 0;
  1415.  
  1416.   if (cl.gametype == GAME_DEATHMATCH)
  1417.   {
  1418.     Sbar_DeathmatchOverlay ();
  1419.     return;
  1420.   }
  1421.  
  1422.   pic = Draw_CachePic ("gfx/complete.lmp");
  1423.   Draw_Pic (64, 24, pic);
  1424.  
  1425.   pic = Draw_CachePic ("gfx/inter.lmp");
  1426.   Draw_TransPic (0, 56, pic);
  1427.  
  1428. // time
  1429.   dig = cl.completed_time/60;
  1430.   Sbar_IntermissionNumber (160, 64, dig, 3, 0);
  1431.   num = cl.completed_time - dig*60;
  1432.   Draw_TransPic (234,64,sb_colon);
  1433.   Draw_TransPic (246,64,sb_nums[0][num/10]);
  1434.   Draw_TransPic (266,64,sb_nums[0][num%10]);
  1435.  
  1436.   Sbar_IntermissionNumber (160, 104, cl.stats[STAT_SECRETS], 3, 0);
  1437.   Draw_TransPic (232,104,sb_slash);
  1438.   Sbar_IntermissionNumber (240, 104, cl.stats[STAT_TOTALSECRETS], 3, 0);
  1439.  
  1440.   Sbar_IntermissionNumber (160, 144, cl.stats[STAT_MONSTERS], 3, 0);
  1441.   Draw_TransPic (232,144,sb_slash);
  1442.   Sbar_IntermissionNumber (240, 144, cl.stats[STAT_TOTALMONSTERS], 3, 0);
  1443.  
  1444. }
  1445.  
  1446.  
  1447. /*
  1448. ==================
  1449. Sbar_FinaleOverlay
  1450.  
  1451. ==================
  1452. */
  1453. void Sbar_FinaleOverlay (void)
  1454. {
  1455.   qpic_t  *pic;
  1456.  
  1457.   scr_copyeverything = 1;
  1458.  
  1459.   pic = Draw_CachePic ("gfx/finale.lmp");
  1460.   Draw_TransPic ( (vid.width-pic->width)/2, 16, pic);
  1461. }
  1462.