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_carring", true);
+ sb_items[13] = Draw_CachePic ("gfx/sb_flag_red_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_carring", 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);
*/
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;
l = (int) strlen (cl.levelname);
Sbar_DrawString (232 - l*4, 12, cl.levelname);
}
+#endif
}
/*
if (cl.stats[STAT_ITEMS] & (IT_SHOTGUN<<i) )
{
time = cl.item_gettime[i];
- flashon = (int)((cl.time - time)*10);
+ flashon = (int)(max(0, cl.time - time)*10);
if (flashon >= 10)
{
if ( cl.stats[STAT_ACTIVEWEAPON] == (IT_SHOTGUN<<i) )
{
if (cl.stats[STAT_ITEMS] & (1<<hipweapons[i]) )
{
- time = cl.item_gettime[hipweapons[i]];
+ time = max(0, cl.item_gettime[hipweapons[i]]);
flashon = (int)((cl.time - time)*10);
if (flashon >= 10)
{
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)
+ if ((time = max(0, cl.time - cl.weapontime)) < 2)
{
fade = (1.0 - 0.5 * time);
fade *= fade;
Sbar_DrawAlphaPic (0, 0, sb_sbar_minimal, sbar_alpha_fg.value);
// flag icons
- int redflag = ((cl.stats[STAT_ITEMS]>>15) & 3);
+ redflag = ((cl.stats[STAT_ITEMS]>>15) & 3);
if (redflag)
Sbar_DrawPic (10, -85, sb_items[redflag+10]);
- int blueflag = ((cl.stats[STAT_ITEMS]>>17) & 3);
+ blueflag = ((cl.stats[STAT_ITEMS]>>17) & 3);
if (blueflag)
Sbar_DrawPic (10, -145, sb_items[blueflag+14]);
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)
if (s->qw_spectator)
{
if (s->qw_ping || s->qw_packetloss)
- DrawQ_ColoredString(x, y, va("%4i %3i %4i spectator %c%s", bound(0, s->qw_ping, 9999), bound(0, s->qw_packetloss, 99), minutes, 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 );
+ DrawQ_ColoredString(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 );
else
- DrawQ_ColoredString(x, y, va(" %4i spectator %c%s", minutes, 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 );
+ DrawQ_ColoredString(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 );
}
else
{
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
- cl.parsingtextexpectingpingforscores = true; // hide the output of the next ping report
- MSG_WriteByte(&cls.netcon->message, clc_stringcmd);
- MSG_WriteString(&cls.netcon->message, "ping");
+ 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
{