339 lines
7.5 KiB
C
339 lines
7.5 KiB
C
// Copyright (C) 2001-2002 Raven Software.
|
|
//
|
|
// cg_info.c -- display information while data is being loading
|
|
|
|
#include "cg_local.h"
|
|
|
|
#define MAX_LOADING_PLAYER_ICONS 16
|
|
#define MAX_LOADING_ITEM_ICONS 26
|
|
|
|
static int loadingPlayerIconCount;
|
|
static int loadingItemIconCount;
|
|
static qhandle_t loadingPlayerIcons[MAX_LOADING_PLAYER_ICONS];
|
|
static qhandle_t loadingItemIcons[MAX_LOADING_ITEM_ICONS];
|
|
|
|
void CG_LoadBar(void);
|
|
|
|
/*
|
|
======================
|
|
CG_LoadingStage
|
|
======================
|
|
*/
|
|
void CG_LoadingStage ( int stage )
|
|
{
|
|
if ( !cg.loading )
|
|
{
|
|
return;
|
|
}
|
|
|
|
cg.loadStage = stage;
|
|
|
|
if ( cg.loadStage )
|
|
{
|
|
trap_UpdateScreen();
|
|
}
|
|
}
|
|
|
|
/*
|
|
======================
|
|
CG_LoadingString
|
|
======================
|
|
*/
|
|
void CG_LoadingString( const char *s )
|
|
{
|
|
if ( !cg.loading )
|
|
{
|
|
return;
|
|
}
|
|
|
|
Q_strncpyz( cg.infoScreenText, s, sizeof( cg.infoScreenText ) );
|
|
|
|
trap_UpdateScreen();
|
|
}
|
|
|
|
/*
|
|
===================
|
|
CG_LoadingItem
|
|
===================
|
|
*/
|
|
void CG_LoadingItem( int itemNum )
|
|
{
|
|
gitem_t *item;
|
|
|
|
if ( !cg.loading )
|
|
{
|
|
return;
|
|
}
|
|
|
|
item = &bg_itemlist[itemNum];
|
|
|
|
if ( item->icon && loadingItemIconCount < MAX_LOADING_ITEM_ICONS ) {
|
|
loadingItemIcons[loadingItemIconCount++] = trap_R_RegisterShaderNoMip( item->icon );
|
|
}
|
|
|
|
CG_LoadingString( item->pickup_name );
|
|
}
|
|
|
|
/*
|
|
===================
|
|
CG_LoadingClient
|
|
===================
|
|
*/
|
|
void CG_LoadingClient( int clientNum )
|
|
{
|
|
const char *info;
|
|
char personality[MAX_QPATH];
|
|
|
|
if ( !cg.loading )
|
|
{
|
|
return;
|
|
}
|
|
|
|
info = CG_ConfigString( CS_PLAYERS + clientNum );
|
|
|
|
Q_strncpyz( personality, Info_ValueForKey( info, "n" ), sizeof(personality) );
|
|
Q_CleanStr( personality );
|
|
|
|
CG_LoadingString( personality );
|
|
}
|
|
|
|
|
|
/*
|
|
====================
|
|
CG_DrawInformation
|
|
|
|
Draw all the status / pacifier stuff during level loading
|
|
====================
|
|
*/
|
|
void CG_DrawInformation( void )
|
|
{
|
|
static qhandle_t levelshot = 0;
|
|
static char levelshotShader[MAX_QPATH] = "";
|
|
|
|
const char *s;
|
|
const char *info;
|
|
const char *sysInfo;
|
|
char shader[MAX_QPATH];
|
|
int y;
|
|
int value;
|
|
qhandle_t overlay;
|
|
char buf[1024];
|
|
|
|
// As long as the map change flag is set we draw the map change screen
|
|
if ( cg.mMapChange )
|
|
{
|
|
CG_DrawMapChange ( );
|
|
return;
|
|
}
|
|
|
|
info = CG_ConfigString( CS_SERVERINFO );
|
|
sysInfo = CG_ConfigString( CS_SYSTEMINFO );
|
|
|
|
if ( cg.mInRMG )
|
|
{
|
|
const char* terrainInfo;
|
|
|
|
terrainInfo = CG_ConfigString( CS_TERRAINS + 1 );
|
|
if ( terrainInfo )
|
|
{
|
|
s = Info_ValueForKey ( terrainInfo, "terraindef" );
|
|
Com_sprintf ( shader, sizeof(shader), "gfx/menus/levelshots/mp_rmg_%s", s );
|
|
}
|
|
else
|
|
{
|
|
Com_sprintf ( shader, sizeof(shader), "gfx/menus/levelshots/unknownmap_mp" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
s = Info_ValueForKey( info, "mapname" );
|
|
Com_sprintf ( shader, sizeof(shader), "gfx/menus/levelshots/%s", s );
|
|
}
|
|
|
|
if ( Q_stricmp ( levelshotShader, shader ) )
|
|
{
|
|
levelshot = trap_R_RegisterShaderNoMip( shader );
|
|
Com_sprintf ( levelshotShader, sizeof(levelshotShader), shader );
|
|
}
|
|
|
|
overlay = trap_R_RegisterShaderNoMip( "gfx/menus/levelshots/unknownmap_mp" );
|
|
|
|
// Draw the level shot
|
|
trap_R_SetColor( NULL );
|
|
|
|
if ( levelshot )
|
|
{
|
|
vec4_t fade;
|
|
|
|
fade[0] = 1.0f;
|
|
fade[1] = 1.0f;
|
|
fade[2] = 1.0f;
|
|
fade[3] = 1.0f - ((float)cg.loadStage / 15.0f);
|
|
|
|
CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot );
|
|
|
|
trap_R_SetColor ( fade );
|
|
|
|
CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, overlay );
|
|
|
|
trap_R_SetColor ( NULL );
|
|
}
|
|
else
|
|
{
|
|
CG_DrawPic( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, overlay );
|
|
}
|
|
|
|
// Draw the progress bar
|
|
CG_LoadBar();
|
|
|
|
// Determine the string to print
|
|
if ( cg.infoScreenText[0] )
|
|
{
|
|
s = va("Loading... %s", cg.infoScreenText);
|
|
}
|
|
else
|
|
{
|
|
s = "Awaiting snapshot...";
|
|
}
|
|
|
|
// Render the string
|
|
CG_DrawText( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, 198 - 32,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
// draw info string information
|
|
|
|
y = 250-32;
|
|
|
|
// don't print server lines if playing a local game
|
|
trap_Cvar_VariableStringBuffer( "sv_running", buf, sizeof( buf ) );
|
|
if ( !atoi( buf ) )
|
|
{
|
|
// server hostname
|
|
Q_strncpyz(buf, Info_ValueForKey( info, "sv_hostname" ), 1024);
|
|
Q_CleanStr(buf);
|
|
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( buf, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, buf, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
|
|
// pure server
|
|
s = Info_ValueForKey( sysInfo, "sv_pure" );
|
|
if ( atoi(s) )
|
|
{
|
|
s = "Pure Server";
|
|
CG_DrawText( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
// server-specific message of the day
|
|
s = CG_ConfigString( CS_MOTD );
|
|
if ( s[0] )
|
|
{
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
// some extra space after hostname and motd
|
|
y += 10;
|
|
}
|
|
|
|
// map-specific message (long map name)
|
|
s = CG_ConfigString( CS_MESSAGE );
|
|
if ( s[0] )
|
|
{
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
// cheats warning
|
|
s = Info_ValueForKey( sysInfo, "sv_cheats" );
|
|
if ( s[0] == '1' )
|
|
{
|
|
s = "CHEATS ARE ENABLED";
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
|
|
cg.cheats = qtrue;
|
|
}
|
|
else
|
|
{
|
|
s = Info_ValueForKey( info, "sv_punkbuster" );
|
|
if ( s[0] == '1' )
|
|
{
|
|
s = "PUNKBUSTER ENABLED";
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
cg.cheats = qfalse;
|
|
}
|
|
|
|
s = cgs.gametypeData->displayName;
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
y += PROP_HEIGHT;
|
|
|
|
value = atoi( Info_ValueForKey( info, "timelimit" ) );
|
|
if ( value )
|
|
{
|
|
s = va( "Timelimit %i", value );
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
value = atoi( Info_ValueForKey( info, "scorelimit" ) );
|
|
if ( value )
|
|
{
|
|
s = va( "Scorelimit %i", value );
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
y += PROP_HEIGHT;
|
|
}
|
|
|
|
value = atoi( Info_ValueForKey( info, "g_friendlyFire" ) );
|
|
if ( value )
|
|
{
|
|
s = va( "FRIENDLY FIRE ON" );
|
|
CG_DrawText ( 320 - trap_R_GetTextWidth ( s, cgs.media.hudFont, 0.53f, 0 ) / 2, y,
|
|
cgs.media.hudFont, 0.53f, colorWhite, s, 0, 0 );
|
|
y += PROP_HEIGHT;
|
|
}
|
|
}
|
|
|
|
/*
|
|
===================
|
|
CG_LoadBar
|
|
===================
|
|
*/
|
|
|
|
#define LOADBAR_CLIP_WIDTH 256
|
|
#define LOADBAR_CLIP_HEIGHT 64
|
|
#define LOADBAR_BULLET_WIDTH 16
|
|
#define LOADBAR_BULLET_HEIGHT 64
|
|
|
|
void CG_LoadBar(void)
|
|
{
|
|
int x,y,i;
|
|
|
|
y = 50;
|
|
x = (640 - LOADBAR_CLIP_WIDTH) / 2;
|
|
|
|
for (i=0;i < cg.loadStage; i++ )
|
|
{
|
|
CG_DrawPic(x + (i*LOADBAR_BULLET_WIDTH), y, LOADBAR_BULLET_WIDTH, LOADBAR_BULLET_HEIGHT, cgs.media.loadBulletShader );
|
|
}
|
|
|
|
CG_DrawPic ( x, y, LOADBAR_CLIP_WIDTH, LOADBAR_CLIP_HEIGHT, cgs.media.loadClipShader );
|
|
}
|