X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=sbar.c;h=fa2fd15f1daef9e640ebcdeda88933305f10f48d;hb=fea22facbbe8a021e4742016a7fcc083b48916e3;hp=f2d1da545a942de71dd6d904d1bf8d0bb257c4d8;hpb=3812a7631546c17c590061a701191e669659a807;p=xonotic%2Fdarkplaces.git diff --git a/sbar.c b/sbar.c index f2d1da54..fa2fd15f 100644 --- a/sbar.c +++ b/sbar.c @@ -21,83 +21,70 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -typedef struct sbarpic_s -{ - char name[32]; -} -sbarpic_t; - -static sbarpic_t sbarpics[256]; -static int numsbarpics; - -static sbarpic_t *Sbar_NewPic(const char *name) -{ - strcpy(sbarpics[numsbarpics].name, name); - // precache it - // FIXME: precache on every renderer restart (or move this to client) - Draw_CachePic(sbarpics[numsbarpics].name, true); - return sbarpics + (numsbarpics++); -} - -sbarpic_t *sb_disc; +cachepic_t *sb_disc; #define STAT_MINUS 10 // num frame for '-' stats digit -sbarpic_t *sb_nums[2][11]; -sbarpic_t *sb_colon, *sb_slash; -sbarpic_t *sb_ibar; -sbarpic_t *sb_sbar; -sbarpic_t *sb_scorebar; +cachepic_t *sb_nums[2][11]; +cachepic_t *sb_colon, *sb_slash; +cachepic_t *sb_ibar; +cachepic_t *sb_sbar; +cachepic_t *sb_scorebar; // AK only used by NEX -sbarpic_t *sb_sbar_minimal; -sbarpic_t *sb_sbar_overlay; +cachepic_t *sb_sbar_minimal; +cachepic_t *sb_sbar_overlay; // AK changed the bound to 9 -sbarpic_t *sb_weapons[7][9]; // 0 is active, 1 is owned, 2-5 are flashes -sbarpic_t *sb_ammo[4]; -sbarpic_t *sb_sigil[4]; -sbarpic_t *sb_armor[3]; -sbarpic_t *sb_items[32]; +cachepic_t *sb_weapons[7][9]; // 0 is active, 1 is owned, 2-5 are flashes +cachepic_t *sb_ammo[4]; +cachepic_t *sb_sigil[4]; +cachepic_t *sb_armor[3]; +cachepic_t *sb_items[32]; // 0-4 are based on health (in 20 increments) // 0 is static, 1 is temporary animation -sbarpic_t *sb_faces[5][2]; +cachepic_t *sb_faces[5][2]; -sbarpic_t *sb_face_invis; -sbarpic_t *sb_face_quad; -sbarpic_t *sb_face_invuln; -sbarpic_t *sb_face_invis_invuln; +cachepic_t *sb_face_invis; +cachepic_t *sb_face_quad; +cachepic_t *sb_face_invuln; +cachepic_t *sb_face_invis_invuln; qboolean sb_showscores; int sb_lines; // scan lines to draw -sbarpic_t *rsb_invbar[2]; -sbarpic_t *rsb_weapons[5]; -sbarpic_t *rsb_items[2]; -sbarpic_t *rsb_ammo[3]; -sbarpic_t *rsb_teambord; // PGM 01/19/97 - team color border +cachepic_t *rsb_invbar[2]; +cachepic_t *rsb_weapons[5]; +cachepic_t *rsb_items[2]; +cachepic_t *rsb_ammo[3]; +cachepic_t *rsb_teambord; // PGM 01/19/97 - team color border //MED 01/04/97 added two more weapons + 3 alternates for grenade launcher -sbarpic_t *hsb_weapons[7][5]; // 0 is active, 1 is owned, 2-5 are flashes +cachepic_t *hsb_weapons[7][5]; // 0 is active, 1 is owned, 2-5 are flashes //MED 01/04/97 added array to simplify weapon parsing int hipweapons[4] = {HIT_LASER_CANNON_BIT,HIT_MJOLNIR_BIT,4,HIT_PROXIMITY_GUN_BIT}; //MED 01/04/97 added hipnotic items array -sbarpic_t *hsb_items[2]; +cachepic_t *hsb_items[2]; //GAME_SOM stuff: -sbarpic_t *somsb_health; -sbarpic_t *somsb_ammo[4]; -sbarpic_t *somsb_armor[3]; - -sbarpic_t *zymsb_crosshair_center; -sbarpic_t *zymsb_crosshair_line; -sbarpic_t *zymsb_crosshair_health; -sbarpic_t *zymsb_crosshair_ammo; -sbarpic_t *zymsb_crosshair_clip; -sbarpic_t *zymsb_crosshair_background; -sbarpic_t *zymsb_crosshair_left1; -sbarpic_t *zymsb_crosshair_left2; -sbarpic_t *zymsb_crosshair_right; +cachepic_t *somsb_health; +cachepic_t *somsb_ammo[4]; +cachepic_t *somsb_armor[3]; + +cachepic_t *zymsb_crosshair_center; +cachepic_t *zymsb_crosshair_line; +cachepic_t *zymsb_crosshair_health; +cachepic_t *zymsb_crosshair_ammo; +cachepic_t *zymsb_crosshair_clip; +cachepic_t *zymsb_crosshair_background; +cachepic_t *zymsb_crosshair_left1; +cachepic_t *zymsb_crosshair_left2; +cachepic_t *zymsb_crosshair_right; + +cachepic_t *sb_ranking; +cachepic_t *sb_complete; +cachepic_t *sb_inter; +cachepic_t *sb_finale; cvar_t showfps = {CVAR_SAVE, "showfps", "0", "shows your rendered fps (frames per second)"}; cvar_t showtime = {CVAR_SAVE, "showtime", "0", "shows current time of day (useful on screenshots)"}; @@ -109,6 +96,12 @@ cvar_t sbar_alpha_fg = {CVAR_SAVE, "sbar_alpha_fg", "1", "opacity value of the s cvar_t cl_deathscoreboard = {0, "cl_deathscoreboard", "1", "shows scoreboard (+showscores) while dead"}; +cvar_t crosshair_color_red = {CVAR_SAVE, "crosshair_color_red", "1", "customizable crosshair color"}; +cvar_t crosshair_color_green = {CVAR_SAVE, "crosshair_color_green", "0", "customizable crosshair color"}; +cvar_t crosshair_color_blue = {CVAR_SAVE, "crosshair_color_blue", "0", "customizable crosshair color"}; +cvar_t crosshair_color_alpha = {CVAR_SAVE, "crosshair_color_alpha", "1", "how opaque the crosshair should be"}; +cvar_t crosshair_size = {CVAR_SAVE, "crosshair_size", "1", "adjusts size of the crosshair on the screen"}; + void Sbar_MiniDeathmatchOverlay (int x, int y); void Sbar_DeathmatchOverlay (void); void Sbar_IntermissionOverlay (void); @@ -145,196 +138,207 @@ void sbar_start(void) { int i; - numsbarpics = 0; - if (gamemode == GAME_NETHERWORLD) { } else if (gamemode == GAME_SOM) { - sb_disc = Sbar_NewPic("gfx/disc"); + sb_disc = Draw_CachePic("gfx/disc", true); for (i = 0;i < 10;i++) - sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i)); - - somsb_health = Sbar_NewPic("gfx/hud_health"); - somsb_ammo[0] = Sbar_NewPic("gfx/sb_shells"); - somsb_ammo[1] = Sbar_NewPic("gfx/sb_nails"); - somsb_ammo[2] = Sbar_NewPic("gfx/sb_rocket"); - somsb_ammo[3] = Sbar_NewPic("gfx/sb_cells"); - somsb_armor[0] = Sbar_NewPic("gfx/sb_armor1"); - somsb_armor[1] = Sbar_NewPic("gfx/sb_armor2"); - somsb_armor[2] = Sbar_NewPic("gfx/sb_armor3"); + sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), true); + + somsb_health = Draw_CachePic("gfx/hud_health", true); + somsb_ammo[0] = Draw_CachePic("gfx/sb_shells", true); + somsb_ammo[1] = Draw_CachePic("gfx/sb_nails", true); + somsb_ammo[2] = Draw_CachePic("gfx/sb_rocket", true); + somsb_ammo[3] = Draw_CachePic("gfx/sb_cells", true); + somsb_armor[0] = Draw_CachePic("gfx/sb_armor1", true); + somsb_armor[1] = Draw_CachePic("gfx/sb_armor2", true); + somsb_armor[2] = Draw_CachePic("gfx/sb_armor3", true); } else if (gamemode == GAME_NEXUIZ) { for (i = 0;i < 10;i++) - sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i)); - sb_nums[0][10] = Sbar_NewPic ("gfx/num_minus"); - - sb_ammo[0] = Sbar_NewPic ("gfx/sb_shells"); - sb_ammo[1] = Sbar_NewPic ("gfx/sb_bullets"); - sb_ammo[2] = Sbar_NewPic ("gfx/sb_rocket"); - sb_ammo[3] = Sbar_NewPic ("gfx/sb_cells"); - - sb_items[2] = Sbar_NewPic ("gfx/sb_slowmo"); - sb_items[3] = Sbar_NewPic ("gfx/sb_invinc"); - sb_items[4] = Sbar_NewPic ("gfx/sb_energy"); - sb_items[5] = Sbar_NewPic ("gfx/sb_str"); - - sb_sbar = Sbar_NewPic("gfx/sbar"); - sb_sbar_minimal = Sbar_NewPic("gfx/sbar_minimal"); - sb_sbar_overlay = Sbar_NewPic("gfx/sbar_overlay"); + sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), true); + sb_nums[0][10] = Draw_CachePic ("gfx/num_minus", true); + + sb_ammo[0] = Draw_CachePic ("gfx/sb_shells", true); + sb_ammo[1] = Draw_CachePic ("gfx/sb_bullets", true); + sb_ammo[2] = Draw_CachePic ("gfx/sb_rocket", true); + sb_ammo[3] = Draw_CachePic ("gfx/sb_cells", true); + + sb_items[2] = Draw_CachePic ("gfx/sb_slowmo", true); + sb_items[3] = Draw_CachePic ("gfx/sb_invinc", true); + sb_items[4] = Draw_CachePic ("gfx/sb_energy", true); + sb_items[5] = Draw_CachePic ("gfx/sb_str", true); + + sb_items[11] = Draw_CachePic ("gfx/sb_flag_red_taken", true); + sb_items[12] = Draw_CachePic ("gfx/sb_flag_red_lost", true); + sb_items[13] = Draw_CachePic ("gfx/sb_flag_red_carrying", true); + sb_items[14] = Draw_CachePic ("gfx/sb_key_carrying", true); + sb_items[15] = Draw_CachePic ("gfx/sb_flag_blue_taken", true); + sb_items[16] = Draw_CachePic ("gfx/sb_flag_blue_lost", true); + sb_items[17] = Draw_CachePic ("gfx/sb_flag_blue_carrying", true); + + sb_sbar = Draw_CachePic("gfx/sbar", true); + sb_sbar_minimal = Draw_CachePic("gfx/sbar_minimal", true); + sb_sbar_overlay = Draw_CachePic("gfx/sbar_overlay", true); for(i = 0; i < 9;i++) - sb_weapons[0][i] = Sbar_NewPic(va("gfx/inv_weapon%i",i)); + sb_weapons[0][i] = Draw_CachePic(va("gfx/inv_weapon%i",i), true); } else if (gamemode == GAME_ZYMOTIC) { - zymsb_crosshair_center = Sbar_NewPic ("gfx/hud/crosshair_center"); - zymsb_crosshair_line = Sbar_NewPic ("gfx/hud/crosshair_line"); - zymsb_crosshair_health = Sbar_NewPic ("gfx/hud/crosshair_health"); - zymsb_crosshair_clip = Sbar_NewPic ("gfx/hud/crosshair_clip"); - zymsb_crosshair_ammo = Sbar_NewPic ("gfx/hud/crosshair_ammo"); - zymsb_crosshair_background = Sbar_NewPic ("gfx/hud/crosshair_background"); - zymsb_crosshair_left1 = Sbar_NewPic ("gfx/hud/crosshair_left1"); - zymsb_crosshair_left2 = Sbar_NewPic ("gfx/hud/crosshair_left2"); - zymsb_crosshair_right = Sbar_NewPic ("gfx/hud/crosshair_right"); + zymsb_crosshair_center = Draw_CachePic ("gfx/hud/crosshair_center", true); + zymsb_crosshair_line = Draw_CachePic ("gfx/hud/crosshair_line", true); + zymsb_crosshair_health = Draw_CachePic ("gfx/hud/crosshair_health", true); + zymsb_crosshair_clip = Draw_CachePic ("gfx/hud/crosshair_clip", true); + zymsb_crosshair_ammo = Draw_CachePic ("gfx/hud/crosshair_ammo", true); + zymsb_crosshair_background = Draw_CachePic ("gfx/hud/crosshair_background", true); + zymsb_crosshair_left1 = Draw_CachePic ("gfx/hud/crosshair_left1", true); + zymsb_crosshair_left2 = Draw_CachePic ("gfx/hud/crosshair_left2", true); + zymsb_crosshair_right = Draw_CachePic ("gfx/hud/crosshair_right", true); } else { - sb_disc = Sbar_NewPic("gfx/disc"); + sb_disc = Draw_CachePic("gfx/disc", true); for (i = 0;i < 10;i++) { - sb_nums[0][i] = Sbar_NewPic (va("gfx/num_%i",i)); - sb_nums[1][i] = Sbar_NewPic (va("gfx/anum_%i",i)); + sb_nums[0][i] = Draw_CachePic (va("gfx/num_%i",i), true); + sb_nums[1][i] = Draw_CachePic (va("gfx/anum_%i",i), true); } - sb_nums[0][10] = Sbar_NewPic ("gfx/num_minus"); - sb_nums[1][10] = Sbar_NewPic ("gfx/anum_minus"); + sb_nums[0][10] = Draw_CachePic ("gfx/num_minus", true); + sb_nums[1][10] = Draw_CachePic ("gfx/anum_minus", true); - sb_colon = Sbar_NewPic ("gfx/num_colon"); - sb_slash = Sbar_NewPic ("gfx/num_slash"); + sb_colon = Draw_CachePic ("gfx/num_colon", true); + sb_slash = Draw_CachePic ("gfx/num_slash", true); - sb_weapons[0][0] = Sbar_NewPic ("gfx/inv_shotgun"); - sb_weapons[0][1] = Sbar_NewPic ("gfx/inv_sshotgun"); - sb_weapons[0][2] = Sbar_NewPic ("gfx/inv_nailgun"); - sb_weapons[0][3] = Sbar_NewPic ("gfx/inv_snailgun"); - sb_weapons[0][4] = Sbar_NewPic ("gfx/inv_rlaunch"); - sb_weapons[0][5] = Sbar_NewPic ("gfx/inv_srlaunch"); - sb_weapons[0][6] = Sbar_NewPic ("gfx/inv_lightng"); + sb_weapons[0][0] = Draw_CachePic ("gfx/inv_shotgun", true); + sb_weapons[0][1] = Draw_CachePic ("gfx/inv_sshotgun", true); + sb_weapons[0][2] = Draw_CachePic ("gfx/inv_nailgun", true); + sb_weapons[0][3] = Draw_CachePic ("gfx/inv_snailgun", true); + sb_weapons[0][4] = Draw_CachePic ("gfx/inv_rlaunch", true); + sb_weapons[0][5] = Draw_CachePic ("gfx/inv_srlaunch", true); + sb_weapons[0][6] = Draw_CachePic ("gfx/inv_lightng", true); - sb_weapons[1][0] = Sbar_NewPic ("gfx/inv2_shotgun"); - sb_weapons[1][1] = Sbar_NewPic ("gfx/inv2_sshotgun"); - sb_weapons[1][2] = Sbar_NewPic ("gfx/inv2_nailgun"); - sb_weapons[1][3] = Sbar_NewPic ("gfx/inv2_snailgun"); - sb_weapons[1][4] = Sbar_NewPic ("gfx/inv2_rlaunch"); - sb_weapons[1][5] = Sbar_NewPic ("gfx/inv2_srlaunch"); - sb_weapons[1][6] = Sbar_NewPic ("gfx/inv2_lightng"); + sb_weapons[1][0] = Draw_CachePic ("gfx/inv2_shotgun", true); + sb_weapons[1][1] = Draw_CachePic ("gfx/inv2_sshotgun", true); + sb_weapons[1][2] = Draw_CachePic ("gfx/inv2_nailgun", true); + sb_weapons[1][3] = Draw_CachePic ("gfx/inv2_snailgun", true); + sb_weapons[1][4] = Draw_CachePic ("gfx/inv2_rlaunch", true); + sb_weapons[1][5] = Draw_CachePic ("gfx/inv2_srlaunch", true); + sb_weapons[1][6] = Draw_CachePic ("gfx/inv2_lightng", true); for (i = 0;i < 5;i++) { - sb_weapons[2+i][0] = Sbar_NewPic (va("gfx/inva%i_shotgun",i+1)); - sb_weapons[2+i][1] = Sbar_NewPic (va("gfx/inva%i_sshotgun",i+1)); - sb_weapons[2+i][2] = Sbar_NewPic (va("gfx/inva%i_nailgun",i+1)); - sb_weapons[2+i][3] = Sbar_NewPic (va("gfx/inva%i_snailgun",i+1)); - sb_weapons[2+i][4] = Sbar_NewPic (va("gfx/inva%i_rlaunch",i+1)); - sb_weapons[2+i][5] = Sbar_NewPic (va("gfx/inva%i_srlaunch",i+1)); - sb_weapons[2+i][6] = Sbar_NewPic (va("gfx/inva%i_lightng",i+1)); + sb_weapons[2+i][0] = Draw_CachePic (va("gfx/inva%i_shotgun",i+1), true); + sb_weapons[2+i][1] = Draw_CachePic (va("gfx/inva%i_sshotgun",i+1), true); + sb_weapons[2+i][2] = Draw_CachePic (va("gfx/inva%i_nailgun",i+1), true); + sb_weapons[2+i][3] = Draw_CachePic (va("gfx/inva%i_snailgun",i+1), true); + sb_weapons[2+i][4] = Draw_CachePic (va("gfx/inva%i_rlaunch",i+1), true); + sb_weapons[2+i][5] = Draw_CachePic (va("gfx/inva%i_srlaunch",i+1), true); + sb_weapons[2+i][6] = Draw_CachePic (va("gfx/inva%i_lightng",i+1), true); } - sb_ammo[0] = Sbar_NewPic ("gfx/sb_shells"); - sb_ammo[1] = Sbar_NewPic ("gfx/sb_nails"); - sb_ammo[2] = Sbar_NewPic ("gfx/sb_rocket"); - sb_ammo[3] = Sbar_NewPic ("gfx/sb_cells"); - - sb_armor[0] = Sbar_NewPic ("gfx/sb_armor1"); - sb_armor[1] = Sbar_NewPic ("gfx/sb_armor2"); - sb_armor[2] = Sbar_NewPic ("gfx/sb_armor3"); - - sb_items[0] = Sbar_NewPic ("gfx/sb_key1"); - sb_items[1] = Sbar_NewPic ("gfx/sb_key2"); - sb_items[2] = Sbar_NewPic ("gfx/sb_invis"); - sb_items[3] = Sbar_NewPic ("gfx/sb_invuln"); - sb_items[4] = Sbar_NewPic ("gfx/sb_suit"); - sb_items[5] = Sbar_NewPic ("gfx/sb_quad"); - - sb_sigil[0] = Sbar_NewPic ("gfx/sb_sigil1"); - sb_sigil[1] = Sbar_NewPic ("gfx/sb_sigil2"); - sb_sigil[2] = Sbar_NewPic ("gfx/sb_sigil3"); - sb_sigil[3] = Sbar_NewPic ("gfx/sb_sigil4"); - - sb_faces[4][0] = Sbar_NewPic ("gfx/face1"); - sb_faces[4][1] = Sbar_NewPic ("gfx/face_p1"); - sb_faces[3][0] = Sbar_NewPic ("gfx/face2"); - sb_faces[3][1] = Sbar_NewPic ("gfx/face_p2"); - sb_faces[2][0] = Sbar_NewPic ("gfx/face3"); - sb_faces[2][1] = Sbar_NewPic ("gfx/face_p3"); - sb_faces[1][0] = Sbar_NewPic ("gfx/face4"); - sb_faces[1][1] = Sbar_NewPic ("gfx/face_p4"); - sb_faces[0][0] = Sbar_NewPic ("gfx/face5"); - sb_faces[0][1] = Sbar_NewPic ("gfx/face_p5"); - - sb_face_invis = Sbar_NewPic ("gfx/face_invis"); - sb_face_invuln = Sbar_NewPic ("gfx/face_invul2"); - sb_face_invis_invuln = Sbar_NewPic ("gfx/face_inv2"); - sb_face_quad = Sbar_NewPic ("gfx/face_quad"); - - sb_sbar = Sbar_NewPic ("gfx/sbar"); - sb_ibar = Sbar_NewPic ("gfx/ibar"); - sb_scorebar = Sbar_NewPic ("gfx/scorebar"); + sb_ammo[0] = Draw_CachePic ("gfx/sb_shells", true); + sb_ammo[1] = Draw_CachePic ("gfx/sb_nails", true); + sb_ammo[2] = Draw_CachePic ("gfx/sb_rocket", true); + sb_ammo[3] = Draw_CachePic ("gfx/sb_cells", true); + + sb_armor[0] = Draw_CachePic ("gfx/sb_armor1", true); + sb_armor[1] = Draw_CachePic ("gfx/sb_armor2", true); + sb_armor[2] = Draw_CachePic ("gfx/sb_armor3", true); + + sb_items[0] = Draw_CachePic ("gfx/sb_key1", true); + sb_items[1] = Draw_CachePic ("gfx/sb_key2", true); + sb_items[2] = Draw_CachePic ("gfx/sb_invis", true); + sb_items[3] = Draw_CachePic ("gfx/sb_invuln", true); + sb_items[4] = Draw_CachePic ("gfx/sb_suit", true); + sb_items[5] = Draw_CachePic ("gfx/sb_quad", true); + + sb_sigil[0] = Draw_CachePic ("gfx/sb_sigil1", true); + sb_sigil[1] = Draw_CachePic ("gfx/sb_sigil2", true); + sb_sigil[2] = Draw_CachePic ("gfx/sb_sigil3", true); + sb_sigil[3] = Draw_CachePic ("gfx/sb_sigil4", true); + + sb_faces[4][0] = Draw_CachePic ("gfx/face1", true); + sb_faces[4][1] = Draw_CachePic ("gfx/face_p1", true); + sb_faces[3][0] = Draw_CachePic ("gfx/face2", true); + sb_faces[3][1] = Draw_CachePic ("gfx/face_p2", true); + sb_faces[2][0] = Draw_CachePic ("gfx/face3", true); + sb_faces[2][1] = Draw_CachePic ("gfx/face_p3", true); + sb_faces[1][0] = Draw_CachePic ("gfx/face4", true); + sb_faces[1][1] = Draw_CachePic ("gfx/face_p4", true); + sb_faces[0][0] = Draw_CachePic ("gfx/face5", true); + sb_faces[0][1] = Draw_CachePic ("gfx/face_p5", true); + + sb_face_invis = Draw_CachePic ("gfx/face_invis", true); + sb_face_invuln = Draw_CachePic ("gfx/face_invul2", true); + sb_face_invis_invuln = Draw_CachePic ("gfx/face_inv2", true); + sb_face_quad = Draw_CachePic ("gfx/face_quad", true); + + sb_sbar = Draw_CachePic ("gfx/sbar", true); + sb_ibar = Draw_CachePic ("gfx/ibar", true); + sb_scorebar = Draw_CachePic ("gfx/scorebar", true); //MED 01/04/97 added new hipnotic weapons if (gamemode == GAME_HIPNOTIC) { - hsb_weapons[0][0] = Sbar_NewPic ("gfx/inv_laser"); - hsb_weapons[0][1] = Sbar_NewPic ("gfx/inv_mjolnir"); - hsb_weapons[0][2] = Sbar_NewPic ("gfx/inv_gren_prox"); - hsb_weapons[0][3] = Sbar_NewPic ("gfx/inv_prox_gren"); - hsb_weapons[0][4] = Sbar_NewPic ("gfx/inv_prox"); - - hsb_weapons[1][0] = Sbar_NewPic ("gfx/inv2_laser"); - hsb_weapons[1][1] = Sbar_NewPic ("gfx/inv2_mjolnir"); - hsb_weapons[1][2] = Sbar_NewPic ("gfx/inv2_gren_prox"); - hsb_weapons[1][3] = Sbar_NewPic ("gfx/inv2_prox_gren"); - hsb_weapons[1][4] = Sbar_NewPic ("gfx/inv2_prox"); + hsb_weapons[0][0] = Draw_CachePic ("gfx/inv_laser", true); + hsb_weapons[0][1] = Draw_CachePic ("gfx/inv_mjolnir", true); + hsb_weapons[0][2] = Draw_CachePic ("gfx/inv_gren_prox", true); + hsb_weapons[0][3] = Draw_CachePic ("gfx/inv_prox_gren", true); + hsb_weapons[0][4] = Draw_CachePic ("gfx/inv_prox", true); + + hsb_weapons[1][0] = Draw_CachePic ("gfx/inv2_laser", true); + hsb_weapons[1][1] = Draw_CachePic ("gfx/inv2_mjolnir", true); + hsb_weapons[1][2] = Draw_CachePic ("gfx/inv2_gren_prox", true); + hsb_weapons[1][3] = Draw_CachePic ("gfx/inv2_prox_gren", true); + hsb_weapons[1][4] = Draw_CachePic ("gfx/inv2_prox", true); for (i = 0;i < 5;i++) { - hsb_weapons[2+i][0] = Sbar_NewPic (va("gfx/inva%i_laser",i+1)); - hsb_weapons[2+i][1] = Sbar_NewPic (va("gfx/inva%i_mjolnir",i+1)); - hsb_weapons[2+i][2] = Sbar_NewPic (va("gfx/inva%i_gren_prox",i+1)); - hsb_weapons[2+i][3] = Sbar_NewPic (va("gfx/inva%i_prox_gren",i+1)); - hsb_weapons[2+i][4] = Sbar_NewPic (va("gfx/inva%i_prox",i+1)); + hsb_weapons[2+i][0] = Draw_CachePic (va("gfx/inva%i_laser",i+1), true); + hsb_weapons[2+i][1] = Draw_CachePic (va("gfx/inva%i_mjolnir",i+1), true); + hsb_weapons[2+i][2] = Draw_CachePic (va("gfx/inva%i_gren_prox",i+1), true); + hsb_weapons[2+i][3] = Draw_CachePic (va("gfx/inva%i_prox_gren",i+1), true); + hsb_weapons[2+i][4] = Draw_CachePic (va("gfx/inva%i_prox",i+1), true); } - hsb_items[0] = Sbar_NewPic ("gfx/sb_wsuit"); - hsb_items[1] = Sbar_NewPic ("gfx/sb_eshld"); + hsb_items[0] = Draw_CachePic ("gfx/sb_wsuit", true); + hsb_items[1] = Draw_CachePic ("gfx/sb_eshld", true); } else if (gamemode == GAME_ROGUE) { - rsb_invbar[0] = Sbar_NewPic ("gfx/r_invbar1"); - rsb_invbar[1] = Sbar_NewPic ("gfx/r_invbar2"); + rsb_invbar[0] = Draw_CachePic ("gfx/r_invbar1", true); + rsb_invbar[1] = Draw_CachePic ("gfx/r_invbar2", true); - rsb_weapons[0] = Sbar_NewPic ("gfx/r_lava"); - rsb_weapons[1] = Sbar_NewPic ("gfx/r_superlava"); - rsb_weapons[2] = Sbar_NewPic ("gfx/r_gren"); - rsb_weapons[3] = Sbar_NewPic ("gfx/r_multirock"); - rsb_weapons[4] = Sbar_NewPic ("gfx/r_plasma"); + rsb_weapons[0] = Draw_CachePic ("gfx/r_lava", true); + rsb_weapons[1] = Draw_CachePic ("gfx/r_superlava", true); + rsb_weapons[2] = Draw_CachePic ("gfx/r_gren", true); + rsb_weapons[3] = Draw_CachePic ("gfx/r_multirock", true); + rsb_weapons[4] = Draw_CachePic ("gfx/r_plasma", true); - rsb_items[0] = Sbar_NewPic ("gfx/r_shield1"); - rsb_items[1] = Sbar_NewPic ("gfx/r_agrav1"); + rsb_items[0] = Draw_CachePic ("gfx/r_shield1", true); + rsb_items[1] = Draw_CachePic ("gfx/r_agrav1", true); // PGM 01/19/97 - team color border - rsb_teambord = Sbar_NewPic ("gfx/r_teambord"); + rsb_teambord = Draw_CachePic ("gfx/r_teambord", true); // PGM 01/19/97 - team color border - rsb_ammo[0] = Sbar_NewPic ("gfx/r_ammolava"); - rsb_ammo[1] = Sbar_NewPic ("gfx/r_ammomulti"); - rsb_ammo[2] = Sbar_NewPic ("gfx/r_ammoplasma"); + rsb_ammo[0] = Draw_CachePic ("gfx/r_ammolava", true); + rsb_ammo[1] = Draw_CachePic ("gfx/r_ammomulti", true); + rsb_ammo[2] = Draw_CachePic ("gfx/r_ammoplasma", true); } } + + sb_ranking = Draw_CachePic ("gfx/ranking", true); + sb_complete = Draw_CachePic ("gfx/complete", true); + sb_inter = Draw_CachePic ("gfx/inter", true); + sb_finale = Draw_CachePic ("gfx/finale", true); } void sbar_shutdown(void) @@ -347,16 +351,22 @@ void sbar_newmap(void) void Sbar_Init (void) { - Cmd_AddCommand ("+showscores", Sbar_ShowScores, "show scoreboard"); - Cmd_AddCommand ("-showscores", Sbar_DontShowScores, "hide scoreboard"); - Cvar_RegisterVariable (&showfps); - Cvar_RegisterVariable (&showtime); - Cvar_RegisterVariable (&showtime_format); - Cvar_RegisterVariable (&showdate); - Cvar_RegisterVariable (&showdate_format); - Cvar_RegisterVariable (&sbar_alpha_bg); - Cvar_RegisterVariable (&sbar_alpha_fg); - Cvar_RegisterVariable (&cl_deathscoreboard); + Cmd_AddCommand("+showscores", Sbar_ShowScores, "show scoreboard"); + Cmd_AddCommand("-showscores", Sbar_DontShowScores, "hide scoreboard"); + Cvar_RegisterVariable(&showfps); + Cvar_RegisterVariable(&showtime); + Cvar_RegisterVariable(&showtime_format); + Cvar_RegisterVariable(&showdate); + Cvar_RegisterVariable(&showdate_format); + Cvar_RegisterVariable(&sbar_alpha_bg); + Cvar_RegisterVariable(&sbar_alpha_fg); + Cvar_RegisterVariable(&cl_deathscoreboard); + + Cvar_RegisterVariable(&crosshair_color_red); + Cvar_RegisterVariable(&crosshair_color_green); + Cvar_RegisterVariable(&crosshair_color_blue); + Cvar_RegisterVariable(&crosshair_color_alpha); + Cvar_RegisterVariable(&crosshair_size); R_RegisterModule("sbar", sbar_start, sbar_shutdown, sbar_newmap); } @@ -373,14 +383,14 @@ int sbar_x, sbar_y; Sbar_DrawPic ============= */ -void Sbar_DrawPic (int x, int y, sbarpic_t *sbarpic) +void Sbar_DrawPic (int x, int y, cachepic_t *pic) { - DrawQ_Pic (sbar_x + x, sbar_y + y, sbarpic->name, 0, 0, 1, 1, 1, sbar_alpha_fg.value, 0); + DrawQ_Pic (sbar_x + x, sbar_y + y, pic, 0, 0, 1, 1, 1, sbar_alpha_fg.value, 0); } -void Sbar_DrawAlphaPic (int x, int y, sbarpic_t *sbarpic, float alpha) +void Sbar_DrawAlphaPic (int x, int y, cachepic_t *pic, float alpha) { - DrawQ_Pic (sbar_x + x, sbar_y + y, sbarpic->name, 0, 0, 1, 1, 1, alpha, 0); + DrawQ_Pic (sbar_x + x, sbar_y + y, pic, 0, 0, 1, 1, 1, alpha, 0); } /* @@ -392,7 +402,7 @@ Draws one solid graphics character */ void Sbar_DrawCharacter (int x, int y, int num) { - DrawQ_String (sbar_x + x + 4 , sbar_y + y, va("%c", num), 0, 8, 8, 1, 1, 1, sbar_alpha_fg.value, 0); + DrawQ_String (sbar_x + x + 4 , sbar_y + y, va("%c", num), 0, 8, 8, 1, 1, 1, sbar_alpha_fg.value, 0, NULL, true); } /* @@ -402,7 +412,7 @@ Sbar_DrawString */ void Sbar_DrawString (int x, int y, char *str) { - DrawQ_String (sbar_x + x, sbar_y + y, str, 0, 8, 8, 1, 1, 1, sbar_alpha_fg.value, 0); + DrawQ_String (sbar_x + x, sbar_y + y, str, 0, 8, 8, 1, 1, 1, sbar_alpha_fg.value, 0, NULL, true); } /* @@ -461,7 +471,7 @@ void Sbar_DrawXNum (int x, int y, int num, int digits, int lettersize, float r, else frame = *ptr -'0'; - DrawQ_Pic (sbar_x + x, sbar_y + y, sb_nums[0][frame]->name,lettersize,lettersize,r,g,b,a * sbar_alpha_fg.value,flags); + DrawQ_Pic (sbar_x + x, sbar_y + y, sb_nums[0][frame],lettersize,lettersize,r,g,b,a * sbar_alpha_fg.value,flags); x += lettersize; ptr++; @@ -551,20 +561,31 @@ void Sbar_SortFrags (void) { if (color != (cl.scores[fragsort[i]].colors & 15)) { + const char* teamname; + color = cl.scores[fragsort[i]].colors & 15; teamlines++; - if (color == 4) - strcpy(teams[teamlines-1].name, "^1Red Team"); - else if (color == 13) - strcpy(teams[teamlines-1].name, "^4Blue Team"); - else if (color == 9) - strcpy(teams[teamlines-1].name, "^6Pink Team"); - else if (color == 12) - strcpy(teams[teamlines-1].name, "^3Yellow Team"); - else - strcpy(teams[teamlines-1].name, "Total Team Score"); - + switch (color) + { + case 4: + teamname = "^1Red Team"; + break; + case 13: + teamname = "^4Blue Team"; + break; + case 9: + teamname = "^6Pink Team"; + break; + case 12: + teamname = "^3Yellow Team"; + break; + default: + teamname = "Total Team Score"; + break; + } + strlcpy(teams[teamlines-1].name, teamname, sizeof(teams[teamlines-1].name)); + teams[teamlines-1].frags = 0; teams[teamlines-1].colors = color + 16 * color; } @@ -602,6 +623,45 @@ Sbar_SoloScoreboard */ void Sbar_SoloScoreboard (void) { +#if 1 + char str[80], timestr[40]; + int i, max; + int minutes, seconds; + + minutes = (int)(cl.time / 60); + seconds = (int)(cl.time - 60*floor(cl.time/60)); + + // monsters and secrets are now both on the top row + if (gamemode != GAME_NEXUIZ) + Sbar_DrawString(8, 4, va("Monsters:%3i /%3i Secrets :%3i /%3i", cl.stats[STAT_MONSTERS], cl.stats[STAT_TOTALMONSTERS], cl.stats[STAT_SECRETS], cl.stats[STAT_TOTALSECRETS])); + + // figure out the map's filename without path or extension + strlcpy(str, FS_FileWithoutPath(cl.worldmodel ? cl.worldmodel->name : ""), sizeof(str)); + if (strrchr(str, '.')) + *(strrchr(str, '.')) = 0; + + // append a : separator and then the full title + strlcat(str, ":", sizeof(str)); + strlcat(str, cl.levelname, sizeof(str)); + + // make the time string + max = 38 - sprintf(timestr, " %i:%02i", minutes, seconds); + + // if there's a newline character, terminate the string there + if (strchr(str, '\n')) + *(strchr(str, '\n')) = 0; + + // pad with spaces to fill the allotted space and append the time + i = bound(0, (int)strlen(str), max); + while (i < max) + str[i++] = ' '; + str[i] = 0; + strlcat(str, timestr, sizeof(str)); + + // print the line of text + Sbar_DrawString(8, 12, str); + +#else char str[80]; int minutes, seconds, tens, units; int l; @@ -615,8 +675,8 @@ void Sbar_SoloScoreboard (void) } // time - minutes = cl.time / 60; - seconds = cl.time - 60*minutes; + minutes = (int)(cl.time / 60); + seconds = (int)(cl.time - 60*minutes); tens = seconds / 10; units = seconds - 10*tens; sprintf (str,"Time :%3i:%i%i", minutes, tens, units); @@ -630,6 +690,7 @@ void Sbar_SoloScoreboard (void) l = (int) strlen (cl.levelname); Sbar_DrawString (232 - l*4, 12, cl.levelname); } +#endif } /* @@ -640,7 +701,9 @@ Sbar_DrawScoreboard void Sbar_DrawScoreboard (void) { Sbar_SoloScoreboard (); - if (cl.gametype == GAME_DEATHMATCH) + // LordHavoc: changed to draw the deathmatch overlays in any multiplayer mode + //if (cl.gametype == GAME_DEATHMATCH) + if (!cl.islocalgame) Sbar_DeathmatchOverlay (); } @@ -653,11 +716,8 @@ static void Sbar_DrawWeapon(int nr, float fade, int active) const int w_width = 300, w_height = 100, w_space = 10; const float w_scale = 0.4; - DrawQ_Pic(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, sb_weapons[0][nr]->name, w_width * w_scale, w_height * w_scale, (active) ? 1 : 0.6, active ? 1 : 0.6, active ? 1 : 1, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE); - //DrawQ_String(vid_conwidth.integer - (w_space + font_size ), (w_height + w_space) * w_scale * nr + w_space, va("%i",nr+1), 0, font_size, font_size, 1, 0, 0, fade, 0); - - if (active) - DrawQ_Fill(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, w_width * w_scale, w_height * w_scale, 0.3, 0.3, 0.3, fade * sbar_alpha_fg.value, DRAWFLAG_ADDITIVE); + DrawQ_Pic(vid_conwidth.integer - (w_width + w_space) * w_scale, (w_height + w_space) * w_scale * nr + w_space, sb_weapons[0][nr], w_width * w_scale, w_height * w_scale, (active) ? 1 : 0.6, active ? 1 : 0.6, active ? 1 : 1, fade * sbar_alpha_fg.value, DRAWFLAG_NORMAL); + //DrawQ_String(vid_conwidth.integer - (w_space + font_size ), (w_height + w_space) * w_scale * nr + w_space, va("%i",nr+1), 0, font_size, font_size, 1, 0, 0, fade, 0, NULL, true); } /* @@ -688,7 +748,7 @@ void Sbar_DrawInventory (void) if (cl.stats[STAT_ITEMS] & (IT_SHOTGUN<= 10) { if ( cl.stats[STAT_ACTIVEWEAPON] == (IT_SHOTGUN<= 10) { @@ -936,47 +996,20 @@ void Sbar_ShowFPS(void) if (showfps.integer) { float calc; - if (showfps.integer > 1) + static double nexttime = 0, lasttime = 0; + static double framerate = 0; + static int framecount = 0; + double newtime; + newtime = realtime; + if (newtime >= nexttime) { - static double currtime, frametimes[32]; - double newtime, total; - int count, i; - static int framecycle = 0; - - newtime = Sys_DoubleTime(); - frametimes[framecycle] = newtime - currtime; - total = 0; - count = 0; - while(total < 0.2 && count < 32 && frametimes[i = (framecycle - count) & 31]) - { - total += frametimes[i]; - count++; - } - framecycle++; - framecycle &= 31; - if (showfps.integer == 2) - calc = (((double)count / total) + 0.5); - else // showfps 3, rapid update - calc = ((1.0 / (newtime - currtime)) + 0.5); - currtime = newtime; - } - else - { - static double nexttime = 0, lasttime = 0; - static float framerate = 0; - static int framecount = 0; - double newtime; - newtime = Sys_DoubleTime(); - if (newtime >= nexttime) - { - framerate = ((float)framecount / (newtime - lasttime) + 0.5); - lasttime = newtime; - nexttime = max(nexttime + 1, lasttime - 1); - framecount = 0; - } - framecount++; - calc = framerate; + framerate = framecount / (newtime - lasttime); + lasttime = newtime; + nexttime = max(nexttime + 1, lasttime - 1); + framecount = 0; } + framecount++; + calc = framerate; if ((red = (calc < 1.0f))) dpsnprintf(fpsstring, sizeof(fpsstring), "%4i spf", (int)(1.0f / calc + 0.5)); @@ -1000,29 +1033,29 @@ void Sbar_ShowFPS(void) fps_x = vid_conwidth.integer - fps_scalex * strlen(fpsstring); DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(fpsstring), fps_scaley, 0, 0, 0, 0.5, 0); if (red) - DrawQ_String(fps_x, fps_y, fpsstring, 0, fps_scalex, fps_scaley, 1, 0, 0, 1, 0); + DrawQ_String(fps_x, fps_y, fpsstring, 0, fps_scalex, fps_scaley, 1, 0, 0, 1, 0, NULL, true); else - DrawQ_String(fps_x, fps_y, fpsstring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0); + DrawQ_String(fps_x, fps_y, fpsstring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0, NULL, true); fps_y += fps_scaley; } if (timestring[0]) { fps_x = vid_conwidth.integer - fps_scalex * strlen(timestring); DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(timestring), fps_scaley, 0, 0, 0, 0.5, 0); - DrawQ_String(fps_x, fps_y, timestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0); + DrawQ_String(fps_x, fps_y, timestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0, NULL, true); fps_y += fps_scaley; } if (datestring[0]) { fps_x = vid_conwidth.integer - fps_scalex * strlen(datestring); DrawQ_Fill(fps_x, fps_y, fps_scalex * strlen(datestring), fps_scaley, 0, 0, 0, 0.5, 0); - DrawQ_String(fps_x, fps_y, datestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0); + DrawQ_String(fps_x, fps_y, datestring, 0, fps_scalex, fps_scaley, 1, 1, 1, 1, 0, NULL, true); fps_y += fps_scaley; } } } -void Sbar_DrawGauge(float x, float y, const char *picname, float width, float height, float rangey, float rangeheight, float c1, float c2, float c1r, float c1g, float c1b, float c1a, float c2r, float c2g, float c2b, float c2a, float c3r, float c3g, float c3b, float c3a, int drawflags) +void Sbar_DrawGauge(float x, float y, cachepic_t *pic, float width, float height, float rangey, float rangeheight, float c1, float c2, float c1r, float c1g, float c1b, float c1a, float c2r, float c2g, float c2b, float c2a, float c3r, float c3g, float c3b, float c3a, int drawflags) { float r[5]; c2 = bound(0, c2, 1); @@ -1033,13 +1066,13 @@ void Sbar_DrawGauge(float x, float y, const char *picname, float width, float he r[3] = rangey; r[4] = height; if (r[1] > r[0]) - DrawQ_SuperPic(x, y + r[0], picname, width, (r[1] - r[0]), 0,(r[0] / height), c3r,c3g,c3b,c3a, 1,(r[0] / height), c3r,c3g,c3b,c3a, 0,(r[1] / height), c3r,c3g,c3b,c3a, 1,(r[1] / height), c3r,c3g,c3b,c3a, drawflags); + DrawQ_SuperPic(x, y + r[0], pic, width, (r[1] - r[0]), 0,(r[0] / height), c3r,c3g,c3b,c3a, 1,(r[0] / height), c3r,c3g,c3b,c3a, 0,(r[1] / height), c3r,c3g,c3b,c3a, 1,(r[1] / height), c3r,c3g,c3b,c3a, drawflags); if (r[2] > r[1]) - DrawQ_SuperPic(x, y + r[1], picname, width, (r[2] - r[1]), 0,(r[1] / height), c1r,c1g,c1b,c1a, 1,(r[1] / height), c1r,c1g,c1b,c1a, 0,(r[2] / height), c1r,c1g,c1b,c1a, 1,(r[2] / height), c1r,c1g,c1b,c1a, drawflags); + DrawQ_SuperPic(x, y + r[1], pic, width, (r[2] - r[1]), 0,(r[1] / height), c1r,c1g,c1b,c1a, 1,(r[1] / height), c1r,c1g,c1b,c1a, 0,(r[2] / height), c1r,c1g,c1b,c1a, 1,(r[2] / height), c1r,c1g,c1b,c1a, drawflags); if (r[3] > r[2]) - DrawQ_SuperPic(x, y + r[2], picname, width, (r[3] - r[2]), 0,(r[2] / height), c2r,c2g,c2b,c2a, 1,(r[2] / height), c2r,c2g,c2b,c2a, 0,(r[3] / height), c2r,c2g,c2b,c2a, 1,(r[3] / height), c2r,c2g,c2b,c2a, drawflags); + DrawQ_SuperPic(x, y + r[2], pic, width, (r[3] - r[2]), 0,(r[2] / height), c2r,c2g,c2b,c2a, 1,(r[2] / height), c2r,c2g,c2b,c2a, 0,(r[3] / height), c2r,c2g,c2b,c2a, 1,(r[3] / height), c2r,c2g,c2b,c2a, drawflags); if (r[4] > r[3]) - DrawQ_SuperPic(x, y + r[3], picname, width, (r[4] - r[3]), 0,(r[3] / height), c3r,c3g,c3b,c3a, 1,(r[3] / height), c3r,c3g,c3b,c3a, 0,(r[4] / height), c3r,c3g,c3b,c3a, 1,(r[4] / height), c3r,c3g,c3b,c3a, drawflags); + DrawQ_SuperPic(x, y + r[3], pic, width, (r[4] - r[3]), 0,(r[3] / height), c3r,c3g,c3b,c3a, 1,(r[3] / height), c3r,c3g,c3b,c3a, 0,(r[4] / height), c3r,c3g,c3b,c3a, 1,(r[4] / height), c3r,c3g,c3b,c3a, drawflags); } /* @@ -1051,6 +1084,8 @@ extern float v_dmg_time, v_dmg_roll, v_dmg_pitch; extern cvar_t v_kicktime; void Sbar_Draw (void) { + cachepic_t *pic; + if(cl.csqc_vidvars.drawenginesbar) //[515]: csqc drawsbar { if (cl.intermission == 1) @@ -1120,14 +1155,14 @@ void Sbar_Draw (void) else if (sb_lines) { int i; - double time; float fade; + int redflag, blueflag; - // we have a max time 2s (min time = 0) - if ((time = cl.time - cl.weapontime) < 2) + // calculate intensity to draw weapons bar at + fade = 3 - 2 * (cl.time - cl.weapontime); + if (fade > 0) { - fade = (1.0 - 0.5 * time); - fade *= fade; + fade = min(fade, 1); for (i = 0; i < 8;i++) if (cl.stats[STAT_ITEMS] & (1 << i)) Sbar_DrawWeapon(i + 1, fade, (i + 2 == cl.stats[STAT_ACTIVEWEAPON])); @@ -1144,13 +1179,21 @@ void Sbar_Draw (void) else Sbar_DrawAlphaPic (0, 0, sb_sbar_minimal, sbar_alpha_fg.value); - // special items - if (cl.stats[STAT_ITEMS] & IT_INVULNERABILITY) + // flag icons + redflag = ((cl.stats[STAT_ITEMS]>>15) & 3); + blueflag = ((cl.stats[STAT_ITEMS]>>17) & 3); + if (redflag == 3 && blueflag == 3) { - // Nexuiz has no anum pics - //Sbar_DrawNum (36, 0, 666, 3, 1); - // Nexuiz has no disc pic - //Sbar_DrawPic (0, 0, sb_disc); + // The Impossible Combination[tm] + // Can only happen in Key Hunt mode... + Sbar_DrawPic (10 - sbar_x, -179, sb_items[14]); + } + else + { + if (redflag) + Sbar_DrawPic (10 - sbar_x, -109, sb_items[redflag+10]); + if (blueflag) + Sbar_DrawPic (10 - sbar_x, -169, sb_items[blueflag+14]); } // armor @@ -1184,7 +1227,7 @@ void Sbar_Draw (void) } if (sb_lines > 24) - DrawQ_Pic(sbar_x,sbar_y,sb_sbar_overlay->name,0,0,1,1,1,1,DRAWFLAG_MODULATE); + DrawQ_Pic(sbar_x,sbar_y,sb_sbar_overlay,0,0,1,1,1,1,DRAWFLAG_MODULATE); } //if (vid_conwidth.integer > 320 && cl.gametype == GAME_DEATHMATCH) @@ -1192,7 +1235,7 @@ void Sbar_Draw (void) } else if (gamemode == GAME_ZYMOTIC) { - #if 1 +#if 1 float scale = 64.0f / 256.0f; float kickoffset[3]; VectorClear(kickoffset); @@ -1201,16 +1244,16 @@ void Sbar_Draw (void) kickoffset[0] = (v_dmg_time/v_kicktime.value*v_dmg_roll) * 10 * scale; kickoffset[1] = (v_dmg_time/v_kicktime.value*v_dmg_pitch) * 10 * scale; } - sbar_x = (vid_conwidth.integer - 256 * scale)/2 + kickoffset[0]; - sbar_y = (vid_conheight.integer - 256 * scale)/2 + kickoffset[1]; + sbar_x = (int)((vid_conwidth.integer - 256 * scale)/2 + kickoffset[0]); + sbar_y = (int)((vid_conheight.integer - 256 * scale)/2 + kickoffset[1]); // left1 16, 48 : 126 -66 // left2 16, 128 : 196 -66 // right 176, 48 : 196 -136 - Sbar_DrawGauge(sbar_x + 16 * scale, sbar_y + 48 * scale, zymsb_crosshair_left1->name, 64*scale, 80*scale, 78*scale, -66*scale, cl.stats[STAT_AMMO] * (1.0 / 200.0), cl.stats[STAT_SHELLS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); - Sbar_DrawGauge(sbar_x + 16 * scale, sbar_y + 128 * scale, zymsb_crosshair_left2->name, 64*scale, 80*scale, 68*scale, -66*scale, cl.stats[STAT_NAILS] * (1.0 / 200.0), cl.stats[STAT_ROCKETS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); - Sbar_DrawGauge(sbar_x + 176 * scale, sbar_y + 48 * scale, zymsb_crosshair_right->name, 64*scale, 160*scale, 148*scale, -136*scale, cl.stats[STAT_ARMOR] * (1.0 / 300.0), cl.stats[STAT_HEALTH] * (1.0 / 300.0), 0.0f,0.5f,1.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); - DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center->name, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); - #else + Sbar_DrawGauge(sbar_x + 16 * scale, sbar_y + 48 * scale, zymsb_crosshair_left1, 64*scale, 80*scale, 78*scale, -66*scale, cl.stats[STAT_AMMO] * (1.0 / 200.0), cl.stats[STAT_SHELLS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); + Sbar_DrawGauge(sbar_x + 16 * scale, sbar_y + 128 * scale, zymsb_crosshair_left2, 64*scale, 80*scale, 68*scale, -66*scale, cl.stats[STAT_NAILS] * (1.0 / 200.0), cl.stats[STAT_ROCKETS] * (1.0 / 200.0), 0.8f,0.8f,0.0f,1.0f, 0.8f,0.5f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); + Sbar_DrawGauge(sbar_x + 176 * scale, sbar_y + 48 * scale, zymsb_crosshair_right, 64*scale, 160*scale, 148*scale, -136*scale, cl.stats[STAT_ARMOR] * (1.0 / 300.0), cl.stats[STAT_HEALTH] * (1.0 / 300.0), 0.0f,0.5f,1.0f,1.0f, 1.0f,0.0f,0.0f,1.0f, 0.3f,0.3f,0.3f,1.0f, DRAWFLAG_NORMAL); + DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); +#else float scale = 128.0f / 256.0f; float healthstart, healthheight, healthstarttc, healthendtc; float shieldstart, shieldheight, shieldstarttc, shieldendtc; @@ -1226,10 +1269,10 @@ void Sbar_Draw (void) sbar_x = (vid_conwidth.integer - 256 * scale)/2 + kickoffset[0]; sbar_y = (vid_conheight.integer - 256 * scale)/2 + kickoffset[1]; offset = 0; // TODO: offset should be controlled by recoil (question: how to detect firing?) - DrawQ_SuperPic(sbar_x + 120 * scale, sbar_y + ( 88 - offset) * scale, zymsb_crosshair_line->name, 16 * scale, 36 * scale, 0,0, 1,1,1,1, 1,0, 1,1,1,1, 0,1, 1,1,1,1, 1,1, 1,1,1,1, 0); - DrawQ_SuperPic(sbar_x + (132 + offset) * scale, sbar_y + 120 * scale, zymsb_crosshair_line->name, 36 * scale, 16 * scale, 0,1, 1,1,1,1, 0,0, 1,1,1,1, 1,1, 1,1,1,1, 1,0, 1,1,1,1, 0); - DrawQ_SuperPic(sbar_x + 120 * scale, sbar_y + (132 + offset) * scale, zymsb_crosshair_line->name, 16 * scale, 36 * scale, 1,1, 1,1,1,1, 0,1, 1,1,1,1, 1,0, 1,1,1,1, 0,0, 1,1,1,1, 0); - DrawQ_SuperPic(sbar_x + ( 88 - offset) * scale, sbar_y + 120 * scale, zymsb_crosshair_line->name, 36 * scale, 16 * scale, 1,0, 1,1,1,1, 1,1, 1,1,1,1, 0,0, 1,1,1,1, 0,1, 1,1,1,1, 0); + DrawQ_SuperPic(sbar_x + 120 * scale, sbar_y + ( 88 - offset) * scale, zymsb_crosshair_line, 16 * scale, 36 * scale, 0,0, 1,1,1,1, 1,0, 1,1,1,1, 0,1, 1,1,1,1, 1,1, 1,1,1,1, 0); + DrawQ_SuperPic(sbar_x + (132 + offset) * scale, sbar_y + 120 * scale, zymsb_crosshair_line, 36 * scale, 16 * scale, 0,1, 1,1,1,1, 0,0, 1,1,1,1, 1,1, 1,1,1,1, 1,0, 1,1,1,1, 0); + DrawQ_SuperPic(sbar_x + 120 * scale, sbar_y + (132 + offset) * scale, zymsb_crosshair_line, 16 * scale, 36 * scale, 1,1, 1,1,1,1, 0,1, 1,1,1,1, 1,0, 1,1,1,1, 0,0, 1,1,1,1, 0); + DrawQ_SuperPic(sbar_x + ( 88 - offset) * scale, sbar_y + 120 * scale, zymsb_crosshair_line, 36 * scale, 16 * scale, 1,0, 1,1,1,1, 1,1, 1,1,1,1, 0,0, 1,1,1,1, 0,1, 1,1,1,1, 0); healthheight = cl.stats[STAT_HEALTH] * (152.0f / 300.0f); shieldheight = cl.stats[STAT_ARMOR] * (152.0f / 300.0f); healthstart = 204 - healthheight; @@ -1246,18 +1289,20 @@ void Sbar_Draw (void) clipstart = 190 - clipheight; clipstarttc = clipstart * (1.0f / 256.0f); clipendtc = (clipstart + clipheight) * (1.0f / 256.0f); - if (healthheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + healthstart * scale, zymsb_crosshair_health->name, 256 * scale, healthheight * scale, 0,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 1,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 0,healthendtc, 1.0f,0.0f,0.0f,1.0f, 1,healthendtc, 1.0f,0.0f,0.0f,1.0f, DRAWFLAG_NORMAL); - if (shieldheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + shieldstart * scale, zymsb_crosshair_health->name, 256 * scale, shieldheight * scale, 0,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 1,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 0,shieldendtc, 0.0f,0.5f,1.0f,1.0f, 1,shieldendtc, 0.0f,0.5f,1.0f,1.0f, DRAWFLAG_NORMAL); - if (ammoheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + ammostart * scale, zymsb_crosshair_ammo->name, 256 * scale, ammoheight * scale, 0,ammostarttc, 0.8f,0.8f,0.0f,1.0f, 1,ammostarttc, 0.8f,0.8f,0.0f,1.0f, 0,ammoendtc, 0.8f,0.8f,0.0f,1.0f, 1,ammoendtc, 0.8f,0.8f,0.0f,1.0f, DRAWFLAG_NORMAL); - if (clipheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + clipstart * scale, zymsb_crosshair_clip->name, 256 * scale, clipheight * scale, 0,clipstarttc, 1.0f,1.0f,0.0f,1.0f, 1,clipstarttc, 1.0f,1.0f,0.0f,1.0f, 0,clipendtc, 1.0f,1.0f,0.0f,1.0f, 1,clipendtc, 1.0f,1.0f,0.0f,1.0f, DRAWFLAG_NORMAL); - DrawQ_Pic(sbar_x + 0 * scale, sbar_y + 0 * scale, zymsb_crosshair_background->name, 256 * scale, 256 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); - DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center->name, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); - #endif + if (healthheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + healthstart * scale, zymsb_crosshair_health, 256 * scale, healthheight * scale, 0,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 1,healthstarttc, 1.0f,0.0f,0.0f,1.0f, 0,healthendtc, 1.0f,0.0f,0.0f,1.0f, 1,healthendtc, 1.0f,0.0f,0.0f,1.0f, DRAWFLAG_NORMAL); + if (shieldheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + shieldstart * scale, zymsb_crosshair_health, 256 * scale, shieldheight * scale, 0,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 1,shieldstarttc, 0.0f,0.5f,1.0f,1.0f, 0,shieldendtc, 0.0f,0.5f,1.0f,1.0f, 1,shieldendtc, 0.0f,0.5f,1.0f,1.0f, DRAWFLAG_NORMAL); + if (ammoheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + ammostart * scale, zymsb_crosshair_ammo, 256 * scale, ammoheight * scale, 0,ammostarttc, 0.8f,0.8f,0.0f,1.0f, 1,ammostarttc, 0.8f,0.8f,0.0f,1.0f, 0,ammoendtc, 0.8f,0.8f,0.0f,1.0f, 1,ammoendtc, 0.8f,0.8f,0.0f,1.0f, DRAWFLAG_NORMAL); + if (clipheight > 0) DrawQ_SuperPic(sbar_x + 0 * scale, sbar_y + clipstart * scale, zymsb_crosshair_clip, 256 * scale, clipheight * scale, 0,clipstarttc, 1.0f,1.0f,0.0f,1.0f, 1,clipstarttc, 1.0f,1.0f,0.0f,1.0f, 0,clipendtc, 1.0f,1.0f,0.0f,1.0f, 1,clipendtc, 1.0f,1.0f,0.0f,1.0f, DRAWFLAG_NORMAL); + DrawQ_Pic(sbar_x + 0 * scale, sbar_y + 0 * scale, zymsb_crosshair_background, 256 * scale, 256 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); + DrawQ_Pic(sbar_x + 120 * scale, sbar_y + 120 * scale, zymsb_crosshair_center, 16 * scale, 16 * scale, 1, 1, 1, 1, DRAWFLAG_NORMAL); +#endif } else // Quake and others { sbar_y = vid_conheight.integer - SBAR_HEIGHT; - if (cl.gametype == GAME_DEATHMATCH && gamemode != GAME_TRANSFUSION) + // LordHavoc: changed to draw the deathmatch overlays in any multiplayer mode + //if (cl.gametype == GAME_DEATHMATCH && gamemode != GAME_TRANSFUSION) + if (!cl.islocalgame && gamemode != GAME_TRANSFUSION) sbar_x = 0; else sbar_x = (vid_conwidth.integer - 320)/2; @@ -1326,7 +1371,7 @@ void Sbar_Draw (void) Sbar_DrawFace (); // health - Sbar_DrawNum (154, 0, cl.stats[STAT_HEALTH], 3, cl.stats[STAT_HEALTH] <= 25); + Sbar_DrawNum (136, 0, cl.stats[STAT_HEALTH], 3, cl.stats[STAT_HEALTH] <= 25); // ammo icon if (gamemode == GAME_ROGUE) @@ -1362,7 +1407,9 @@ void Sbar_Draw (void) } - if (vid_conwidth.integer > 320 && cl.gametype == GAME_DEATHMATCH) + // LordHavoc: changed to draw the deathmatch overlays in any multiplayer mode + //if (vid_conwidth.integer > 320 && cl.gametype == GAME_DEATHMATCH) + if (!cl.islocalgame && vid_conwidth.integer > 320) { if (gamemode == GAME_TRANSFUSION) Sbar_MiniDeathmatchOverlay (0, 0); @@ -1374,11 +1421,11 @@ void Sbar_Draw (void) Sbar_ShowFPS(); - if(cl.csqc_vidvars.drawcrosshair) - R_Draw2DCrosshair(); + if (cl.csqc_vidvars.drawcrosshair && crosshair.integer >= 1 && crosshair.integer <= NUMCROSSHAIRS && !cl.intermission && !r_letterbox.value && (pic = r_crosshairs[crosshair.integer])) + DrawQ_Pic((vid_conwidth.integer - pic->width * crosshair_size.value) * 0.5f, (vid_conheight.integer - pic->height * crosshair_size.value) * 0.5f, pic, pic->width * crosshair_size.value, pic->height * crosshair_size.value, crosshair_color_red.value, crosshair_color_green.value, crosshair_color_blue.value, crosshair_color_alpha.value, 0); if (cl_prydoncursor.integer) - DrawQ_Pic((cl.cmd.cursor_screen[0] + 1) * 0.5 * vid_conwidth.integer, (cl.cmd.cursor_screen[1] + 1) * 0.5 * vid_conheight.integer, va("gfx/prydoncursor%03i", cl_prydoncursor.integer), 0, 0, 1, 1, 1, 1, 0); + DrawQ_Pic((cl.cmd.cursor_screen[0] + 1) * 0.5 * vid_conwidth.integer, (cl.cmd.cursor_screen[1] + 1) * 0.5 * vid_conheight.integer, Draw_CachePic(va("gfx/prydoncursor%03i", cl_prydoncursor.integer), true), 0, 0, 1, 1, 1, 1, 0); } //============================================================================= @@ -1391,43 +1438,127 @@ Sbar_DeathmatchOverlay */ float Sbar_PrintScoreboardItem(scoreboard_t *s, float x, float y) { + int minutes; unsigned char *c; - // draw colors behind score - c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8]; - DrawQ_Fill(x + 8, y+1, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); - c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8]; - DrawQ_Fill(x + 8, y+4, 32, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); - // print the text - //DrawQ_String(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); - // FIXME: use a constant for this color tag instead - DrawQ_ColoredString(x, y, va("%c%4i %s" STRING_COLOR_DEFAULT_STR, (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL ); + minutes = (int)((cl.intermission ? cl.completed_time - s->qw_entertime : cl.time - s->qw_entertime) / 60.0); + if (cls.protocol == PROTOCOL_QUAKEWORLD) + { + if (s->qw_spectator) + { + if (s->qw_ping || s->qw_packetloss) + DrawQ_String(x, y, va("%4i %3i %4i spectator %c%s", bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), minutes, (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + else + DrawQ_String(x, y, va(" %4i spectator %c%s", minutes, (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + else + { + // draw colors behind score + c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8]; + DrawQ_Fill(x + 14*8, y+1, 40, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); + c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8]; + DrawQ_Fill(x + 14*8, y+4, 40, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); + // print the text + //DrawQ_String(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, true); + if (s->qw_ping || s->qw_packetloss) + DrawQ_String(x, y, va("%4i %3i %4i %5i %-4s %c%s", bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), minutes,(int) s->frags, cl.qw_teamplay ? s->qw_team : "", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + else + DrawQ_String(x, y, va(" %4i %5i %-4s %c%s", minutes,(int) s->frags, cl.qw_teamplay ? s->qw_team : "", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + } + else + { + if (s->qw_spectator) + { + if (s->qw_ping || s->qw_packetloss) + DrawQ_String(x, y, va("%4i %3i spect %c%s", bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + else + DrawQ_String(x, y, va(" spect %c%s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + else + { + // draw colors behind score + c = (unsigned char *)&palette_complete[(s->colors & 0xf0) + 8]; + DrawQ_Fill(x + 9*8, y+1, 40, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); + c = (unsigned char *)&palette_complete[((s->colors & 15)<<4) + 8]; + DrawQ_Fill(x + 9*8, y+4, 40, 3, c[0] * (1.0f / 255.0f), c[1] * (1.0f / 255.0f), c[2] * (1.0f / 255.0f), c[3] * (1.0f / 255.0f) * sbar_alpha_fg.value, 0); + // print the text + //DrawQ_String(x, y, va("%c%4i %s", (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', (int) s->frags, s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, true); + if (s->qw_ping || s->qw_packetloss) + DrawQ_String(x, y, va("%4i %3i %5i %c%s", bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), (int) s->frags, (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + else + DrawQ_String(x, y, va(" %5i %c%s", (int) s->frags, (s - cl.scores) == cl.playerentity - 1 ? 13 : ' ', s->name), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + } return 8; } void Sbar_DeathmatchOverlay (void) { int i, x, y; - cachepic_t *pic; - pic = Draw_CachePic ("gfx/ranking", true); - DrawQ_Pic ((vid_conwidth.integer - pic->width)/2, 8, "gfx/ranking", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); + // request new ping times every two second + if (cl.last_ping_request < realtime - 2 && cls.netcon) + { + cl.last_ping_request = realtime; + if (cls.protocol == PROTOCOL_QUAKEWORLD) + { + MSG_WriteByte(&cls.netcon->message, qw_clc_stringcmd); + MSG_WriteString(&cls.netcon->message, "pings"); + } + else if (cls.protocol == PROTOCOL_QUAKE || cls.protocol == PROTOCOL_QUAKEDP || cls.protocol == PROTOCOL_NEHAHRAMOVIE || cls.protocol == PROTOCOL_DARKPLACES1 || cls.protocol == PROTOCOL_DARKPLACES2 || cls.protocol == PROTOCOL_DARKPLACES3 || cls.protocol == PROTOCOL_DARKPLACES4 || cls.protocol == PROTOCOL_DARKPLACES5 || cls.protocol == PROTOCOL_DARKPLACES6 || cls.protocol == PROTOCOL_DARKPLACES7) + { + // these servers usually lack the pings command and so a less efficient "ping" command must be sent, which on modern DP servers will also reply with a pingplreport command after the ping listing + static int ping_anyway_counter = 0; + if(cl.parsingtextexpectingpingforscores == 1) + { + Con_DPrintf("want to send ping, but still waiting for other reply\n"); + if(++ping_anyway_counter >= 5) + cl.parsingtextexpectingpingforscores = 0; + } + if(cl.parsingtextexpectingpingforscores != 1) + { + ping_anyway_counter = 0; + cl.parsingtextexpectingpingforscores = 1; // hide the output of the next ping report + MSG_WriteByte(&cls.netcon->message, clc_stringcmd); + MSG_WriteString(&cls.netcon->message, "ping"); + } + } + else + { + // newer server definitely has pings command, so use it for more efficiency + MSG_WriteByte(&cls.netcon->message, clc_stringcmd); + MSG_WriteString(&cls.netcon->message, "pings"); + } + } + + DrawQ_Pic ((vid_conwidth.integer - sb_ranking->width)/2, 8, sb_ranking, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); // scores Sbar_SortFrags (); // draw the text - x = (vid_conwidth.integer - (6 + 15) * 8) / 2; y = 40; + if (cls.protocol == PROTOCOL_QUAKEWORLD) + { + x = (vid_conwidth.integer - (26 + 15) * 8) / 2; // 26 characters until name, then we assume 15 character names (they can be longer but usually aren't) + DrawQ_String(x, y, va("ping pl%% time frags team name"), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + else + { + x = (vid_conwidth.integer - (16 + 15) * 8) / 2; // 16 characters until name, then we assume 15 character names (they can be longer but usually aren't) + DrawQ_String(x, y, va("ping pl%% frags name"), 0, 8, 8, 1, 1, 1, 1 * sbar_alpha_fg.value, 0, NULL, false ); + } + y += 8; if (Sbar_IsTeammatch ()) { // show team scores first for (i = 0;i < teamlines && y < vid_conheight.integer;i++) - y += Sbar_PrintScoreboardItem((teams + teamsort[i]), x, y); + y += (int)Sbar_PrintScoreboardItem((teams + teamsort[i]), x, y); y += 5; } for (i = 0;i < scoreboardlines && y < vid_conheight.integer;i++) - y += Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); + y += (int)Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); } /* @@ -1466,12 +1597,12 @@ void Sbar_MiniDeathmatchOverlay (int x, int y) if (gamemode == GAME_TRANSFUSION) { for (;i < scoreboardlines && x < vid_conwidth.integer;i++) - x += 128 + Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); + x += 128 + (int)Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); } else { for (;i < scoreboardlines && y < vid_conheight.integer;i++) - y += Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); + y += (int)Sbar_PrintScoreboardItem(cl.scores + fragsort[i], x, y); } } @@ -1486,7 +1617,9 @@ void Sbar_IntermissionOverlay (void) int dig; int num; - if (cl.gametype == GAME_DEATHMATCH) + // LordHavoc: changed to draw the deathmatch overlays in any multiplayer mode + //if (cl.gametype == GAME_DEATHMATCH) + if (!cl.islocalgame) { Sbar_DeathmatchOverlay (); return; @@ -1495,13 +1628,13 @@ void Sbar_IntermissionOverlay (void) sbar_x = (vid_conwidth.integer - 320) >> 1; sbar_y = (vid_conheight.integer - 200) >> 1; - DrawQ_Pic (sbar_x + 64, sbar_y + 24, "gfx/complete", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); - DrawQ_Pic (sbar_x + 0, sbar_y + 56, "gfx/inter", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); + DrawQ_Pic (sbar_x + 64, sbar_y + 24, sb_complete, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); + DrawQ_Pic (sbar_x + 0, sbar_y + 56, sb_inter, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); // time - dig = cl.completed_time/60; + dig = (int)cl.completed_time / 60; Sbar_DrawNum (160, 64, dig, 3, 0); - num = cl.completed_time - dig*60; + num = (int)cl.completed_time - dig*60; if (gamemode != GAME_NEXUIZ) Sbar_DrawPic (234,64,sb_colon); Sbar_DrawPic (246,64,sb_nums[0][num/10]); @@ -1528,9 +1661,6 @@ Sbar_FinaleOverlay */ void Sbar_FinaleOverlay (void) { - cachepic_t *pic; - - pic = Draw_CachePic ("gfx/finale", true); - DrawQ_Pic((vid_conwidth.integer - pic->width)/2, 16, "gfx/finale", 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); + DrawQ_Pic((vid_conwidth.integer - sb_finale->width)/2, 16, sb_finale, 0, 0, 1, 1, 1, 1 * sbar_alpha_fg.value, 0); }