reaction/code/cgame/cg_info.c
2013-01-04 13:27:22 +00:00

488 lines
14 KiB
C

//-----------------------------------------------------------------------------
//
// $Id$
//
//-----------------------------------------------------------------------------
//
// $Log$
// Revision 1.37 2002/11/09 14:13:32 makro
// Added tdmMode info to the loading screen
//
// Revision 1.36 2002/08/29 04:42:40 blaze
// Anti OGC code
//
// Revision 1.35 2002/08/28 02:06:21 blaze
// Add SV_PURE DISABLED when connecting to a server with pure disabled. It still prints PURE SERVER when it\'s enabled, but clients may not notice it when it\'s gone.
//
// Revision 1.34 2002/06/29 04:15:15 jbravo
// CTF is now CTB. no weapons while the case is in hand other than pistol or knife
//
// Revision 1.33 2002/06/16 20:06:13 jbravo
// Reindented all the source files with "indent -kr -ut -i8 -l120 -lc120 -sob -bad -bap"
//
// Revision 1.32 2002/06/16 19:12:52 jbravo
// Removed the MISSIONPACK ifdefs and missionpack only code.
//
// Revision 1.31 2002/06/08 14:07:52 makro
// no message
//
// Revision 1.30 2002/06/08 11:41:01 makro
// The loading screen code will now look for
// levelshots/load_mapname.tga first
//
// Revision 1.29 2002/06/03 19:19:43 niceass
// matchmode change
//
// Revision 1.28 2002/06/01 13:35:47 makro
// Added clapper to loading screen
//
// Revision 1.27 2002/05/31 19:01:33 makro
// Unfixed something
//
// Revision 1.26 2002/05/31 00:17:06 jbravo
// Slicers fix for the weaponswitching issue
//
// Revision 1.25 2002/05/28 21:06:37 jbravo
// I broke the progressbar. Final fix for that
//
// Revision 1.24 2002/05/28 03:10:50 jbravo
// My fixups broke stuff
//
// Revision 1.23 2002/05/27 17:47:19 jbravo
// Fixes and cleanups
//
// Revision 1.22 2002/05/26 06:17:27 makro
// Loading screen again
//
// Revision 1.21 2002/05/26 05:15:16 niceass
// pregress bar
//
// Revision 1.20 2002/05/26 05:00:19 makro
// Loading screen
//
// Revision 1.19 2002/05/25 16:39:16 makro
// Loading screen
//
// Revision 1.18 2002/05/25 10:40:31 makro
// Loading screen
//
// Revision 1.17 2002/05/24 18:41:34 makro
// Loading screen
//
// Revision 1.16 2002/05/02 23:04:59 makro
// Loading screen. Jump kicks
//
// Revision 1.15 2002/05/02 12:44:07 makro
// Customizable color for the loading screen text
//
// Revision 1.14 2002/03/31 03:31:24 jbravo
// Compiler warning cleanups
//
// Revision 1.13 2002/03/24 21:24:51 makro
// Added a drop-shadow effect to the loading screen
//
// Revision 1.12 2002/03/03 18:10:20 makro
// Changed the colors for the 'loading map' screen a bit
//
// Revision 1.11 2002/01/11 20:20:57 jbravo
// Adding TP to main branch
//
// Revision 1.10 2002/01/11 19:48:29 jbravo
// Formatted the source in non DOS format.
//
// Revision 1.9 2001/12/31 16:28:41 jbravo
// I made a Booboo with the Log tag.
//
//
//-----------------------------------------------------------------------------
// Copyright (C) 1999-2000 Id Software, Inc.
//
// 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];
/*
===================
CG_DrawLoadingIcons
===================
// JBravo: apparently not used.
*/
/*
static void CG_DrawLoadingIcons( void ) {
int n;
int x, y;
for( n = 0; n < loadingPlayerIconCount; n++ ) {
x = 16 + n * 78;
y = 324-40;
CG_DrawPic( x, y, 64, 64, loadingPlayerIcons[n] );
}
for( n = 0; n < loadingItemIconCount; n++ ) {
y = 400-40;
if( n >= 13 ) {
y += 40;
}
x = 16 + n % 13 * 48;
CG_DrawPic( x, y, 32, 32, loadingItemIcons[n] );
}
}
*/
/*
======================
CG_LoadingString
======================
*/
void CG_LoadingString(const char *s)
{
Q_strncpyz(cg.infoScreenText, s, sizeof(cg.infoScreenText));
trap_UpdateScreen();
}
/*
===================
CG_LoadingItem
===================
*/
void CG_LoadingItem(int itemNum)
{
gitem_t *item;
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 *skin;
char personality[MAX_QPATH];
char model[MAX_QPATH];
char iconName[MAX_QPATH];
info = CG_ConfigString(CS_PLAYERS + clientNum);
if (loadingPlayerIconCount < MAX_LOADING_PLAYER_ICONS) {
Q_strncpyz(model, Info_ValueForKey(info, "model"), sizeof(model));
skin = strrchr(model, '/');
if (skin) {
*skin++ = '\0';
} else {
skin = "default";
}
Com_sprintf(iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", model, skin);
loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip(iconName);
if (!loadingPlayerIcons[loadingPlayerIconCount]) {
Com_sprintf(iconName, MAX_QPATH, "models/players/characters/%s/icon_%s.tga", model, skin);
loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip(iconName);
}
if (!loadingPlayerIcons[loadingPlayerIconCount]) {
// Elder: changed
Com_sprintf(iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", DEFAULT_MODEL, DEFAULT_SKIN);
//Com_sprintf( iconName, MAX_QPATH, "models/players/%s/icon_%s.tga", DEFAULT_MODEL, "default" );
loadingPlayerIcons[loadingPlayerIconCount] = trap_R_RegisterShaderNoMip(iconName);
}
if (loadingPlayerIcons[loadingPlayerIconCount]) {
loadingPlayerIconCount++;
}
}
Q_strncpyz(personality, Info_ValueForKey(info, "n"), sizeof(personality));
Q_CleanStr(personality);
if (cgs.gametype == GT_SINGLE_PLAYER) {
trap_S_RegisterSound(va("sound/player/announce/%s.wav", personality), qtrue);
}
CG_LoadingString(personality);
}
/*
====================
CG_DrawInformation
Draw all the status / pacifier stuff during level loading
====================
*/
#define LS_TOPMARGIN 72
#define LS_BOTTOMMARGIN 48
#define LS_CHAR_WIDTH 8
#define LS_CHAR_HEIGHT 12
void CG_DrawInformation(void)
{
const char *s;
const char *info;
const char *sysInfo;
const char *line;
int x = 8, y, value, bar = 0;
qhandle_t levelshot, shadow, clapper;
//qhandle_t detail;
qhandle_t percentBox;
char buf[1024];
//qboolean skipdetail;
vec4_t color1 = { .75, .75, .75, 1 }, color2 = {
1, 1, 1, 1};
info = CG_ConfigString(CS_SERVERINFO);
sysInfo = CG_ConfigString(CS_SYSTEMINFO);
/* Makro - no longer used
//Makro - settings read from the worldspawn entity
s = CG_ConfigString( CS_LOADINGSCREEN );
color1[0] = atof(Info_ValueForKey(s, "r1"));
color1[1] = atof(Info_ValueForKey(s, "g1"));
color1[2] = atof(Info_ValueForKey(s, "b1"));
color2[0] = atof(Info_ValueForKey(s, "r2"));
color2[1] = atof(Info_ValueForKey(s, "g2"));
color2[2] = atof(Info_ValueForKey(s, "b2"));
color1[3] = color2[3] = 1;
skipdetail = ( atoi(Info_ValueForKey(s, "nodetail")) != 0 );
*/
s = Info_ValueForKey(info, "mapname");
shadow = trap_R_RegisterShaderNoMip("ui/assets/rq3-main-shadow-1.tga");
levelshot = trap_R_RegisterShaderNoMip(va("levelshots/load_%s.tga", s));
percentBox = trap_R_RegisterShaderNoMip("gfx/percent.tga");
//Makro - added
if (!levelshot) {
levelshot = trap_R_RegisterShaderNoMip(va("levelshots/%s.tga", s));
}
if (!levelshot) {
//Elder: changed
levelshot = trap_R_RegisterShaderNoMip("levelshots/rq3-unknownmap.tga");
//skipdetail = qtrue;
}
trap_R_SetColor(NULL);
CG_DrawPic(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, levelshot);
/* Makro - removed
// blend a detail texture over it
//Elder: changed to RQ3 detail overlay
if (!skipdetail) {
detail = trap_R_RegisterShader( "rq3-levelShotDetail" );
trap_R_DrawStretchPic( 0, 0, cgs.glconfig.vidWidth, cgs.glconfig.vidHeight, 0, 0, 2.5, 2, detail );
}
*/
//Elder: "Letterbox" mask
//Makro - changed it a bit
CG_FillRect(0, 0, SCREEN_WIDTH, LS_TOPMARGIN, colorBlack);
CG_FillRect(0, LS_TOPMARGIN, SCREEN_WIDTH, 2, colorMdGrey);
CG_FillRect(0, SCREEN_HEIGHT - LS_BOTTOMMARGIN, SCREEN_WIDTH, LS_BOTTOMMARGIN, colorBlack);
CG_FillRect(0, SCREEN_HEIGHT - LS_BOTTOMMARGIN - 2, SCREEN_WIDTH, 2, colorMdGrey);
//Makro - shadow
CG_DrawPic(0, LS_TOPMARGIN + 2, 640, 12, shadow);
//Elder: mapname
//Makro - removed
//UI_DrawProportionalString(x, 26, s, UI_LEFT|UI_DROPSHADOW, colorDkGrey);
//CG_DrawBigStringColor(4, 24, s, color_red);
//Elder: removed
// draw the icons of things as they are loaded
//CG_DrawLoadingIcons();
// draw info string information
//Elder: Initial y-position
y = LS_TOPMARGIN - 8 - LS_CHAR_HEIGHT;
// map-specific message (long map name)
s = CG_ConfigString(CS_MESSAGE);
if (s[0]) {
//Makro - allow color-coded text; also changed to use custom color instead of colorLtGrey
//CG_DrawSmallStringColor(x, y, s, colorMdGrey);
//CG_DrawStringExt(x, y, s, colorWhite, qtrue, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
CG_DrawStringExt(x, y, s, color1, qtrue, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
y -= (2 * LS_CHAR_HEIGHT);
}
//y += LS_CHAR_HEIGHT;
// game type
switch (cgs.gametype) {
case GT_FFA:
line = "CLASSIC ACTION DEATHMATCH";
break;
case GT_SINGLE_PLAYER:
line = "SINGLE PLAYER";
break;
case GT_TOURNAMENT:
line = "TOURNAMENT";
break;
//Makro - added tdmMode
case GT_TEAM:
line = (atoi(Info_ValueForKey(info, "g_RQ3_tdmMode")) != 0) ? "TEAM DEATHMATCH (CLASSIC)" : "TEAM DEATHMATCH (TP-STYLE)";
break;
// JBravo: teamplay stuff.
case GT_TEAMPLAY:
//Makro - changed from RQ3 Teamplay
line = "CLASSIC ACTION TEAMPLAY";
break;
// JBravo: now knows as CTB
case GT_CTF:
line = "CAPTURE THE BRIEFCASE";
break;
default:
line = "UNKNOWN GAMETYPE";
break;
}
// JBravo: the call to Q_strupr seems to crash Q3 when running as dll or .so. Attempting a fix
// Makro: the fix crashes Q3 with .dll's, unfixing ;P
//strcat (line, '\0');
//line = Q_strupr(line);
// cheats warning
s = Info_ValueForKey(sysInfo, "sv_cheats");
//Makro - didn't like this
//if ( s[0] == '1' ) {
if (atoi(s))
line = va("%s / CHEATS ARE ENABLED", line);
if (cg_RQ3_matchmode.integer)
line = va("%s / MATCHMODE", line);
s = Info_ValueForKey(sysInfo, "sv_pure");
if (atoi(s) == 0)
line = va("%s / SV_PURE OFF", line);
//Makro - custom color; changed from colorWhite
//CG_DrawSmallStringColor(x, y, line, color2);
CG_DrawStringExt(x, y, line, color2, qfalse, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
y -= LS_CHAR_HEIGHT;
line = "";
// pure server
s = Info_ValueForKey(sysInfo, "sv_pure");
if (atoi(s)) {
if (line[0])
line = va("%s / ", line);
line = va("%sPURE SERVER", line);
}
value = atoi(Info_ValueForKey(info, "timelimit"));
if (value) {
line = va("TIMELIMIT %i", value);
}
if (cgs.gametype <= GT_TEAM) {
value = atoi(Info_ValueForKey(info, "fraglimit"));
if (value) {
if (line[0])
line = va("%s / ", line);
line = va("%sFRAGLIMIT %i", line, value);
}
} else if (cgs.gametype == GT_TEAMPLAY) {
value = atoi(Info_ValueForKey(info, "g_RQ3_roundlimit"));
if (value) {
if (line[0])
line = va("%s / ", line);
line = va("%sROUNDLIMIT %i", line, value);
}
} else {
value = atoi(Info_ValueForKey(info, "capturelimit"));
if (value) {
if (line[0])
line = va("%s / ", line);
line = va("%sCAPTURELIMIT %i", line, value);
}
}
//Makro - don't write unless there's something to write
if (line[0]) {
CG_DrawStringExt(x, y, line, color2, qfalse, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
y -= LS_CHAR_HEIGHT;
}
line = "";
// 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);
if (buf[0] && Q_stricmp(buf, "noname")) {
line = va("%s", buf);
}
// server-specific message of the day
s = CG_ConfigString(CS_MOTD);
if (s[0]) {
if (line[0])
line = va("%s / ", line);
line = va("%s%s", line, s);
}
//Makro - don't write unless there's something to write
if (line[0]) {
CG_DrawStringExt(x, y, line, color2, qfalse, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
y -= LS_CHAR_HEIGHT;
}
}
// BOTTOM //
// the first 150 rows are reserved for the client connection
// screen to write into
//y = SCREEN_HEIGHT - (int) (0.5 * (LS_BOTTOMMARGIN + LS_CHAR_HEIGHT));
y = SCREEN_HEIGHT - LS_BOTTOMMARGIN + 8;
if (cg.infoScreenText[0]) {
CG_DrawStringExt(x, y, va("LOADING... %s", Q_strupr(cg.infoScreenText)), color2, qfalse, qfalse,
LS_CHAR_WIDTH, LS_CHAR_HEIGHT, 0);
//UI_DrawProportionalString(SCREEN_WIDTH - 8, y, va("LOADING... %s", Q_strupr(cg.infoScreenText)), UI_RIGHT, colorWhite);
} else {
CG_DrawStringExt(x, y, "AWAITING SNAPSHOT...", color2, qfalse, qfalse, LS_CHAR_WIDTH, LS_CHAR_HEIGHT,
0);
//UI_DrawProportionalString(SCREEN_WIDTH - 8, y, "AWAITING SNAPSHOT...", UI_RIGHT, colorWhite);
}
//y += 24;
clapper = trap_R_RegisterShaderNoMip(va("levelshots/clapper_%s.tga", Info_ValueForKey(info, "mapname")));
if (clapper) {
y = LS_TOPMARGIN - 8 - LS_CHAR_HEIGHT;
CG_DrawPic(392, 296, 240, 180, clapper);
}
if (percentBox) {
trap_R_SetColor(colorWhite);
for (bar = 0; bar < ceil(cg.loadingMapPercent * 10) && bar < 10; bar++) {
CG_DrawPic(SCREEN_WIDTH - (11 - bar) * 10, y, 8, 8, percentBox);
}
trap_R_SetColor(colorDkGrey);
for (; bar < 10; bar++) {
CG_DrawPic(SCREEN_WIDTH - (11 - bar) * 10, y, 8, 8, percentBox);
}
} else {
for (bar = 0; bar < ceil(cg.loadingMapPercent * 10) && bar < 10; bar++) {
CG_FillRect(SCREEN_WIDTH - (11 - bar) * 10, y, 8, 8, colorWhite);
}
for (; bar < 10; bar++) {
CG_FillRect(SCREEN_WIDTH - (11 - bar) * 10, y, 8, 8, colorDkGrey);
}
}
}