Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_serverinfo.c (6776B)


      1 /*
      2 ===========================================================================
      3 Copyright (C) 1999-2005 Id Software, Inc.
      4 
      5 This file is part of Quake III Arena source code.
      6 
      7 Quake III Arena source code is free software; you can redistribute it
      8 and/or modify it under the terms of the GNU General Public License as
      9 published by the Free Software Foundation; either version 2 of the License,
     10 or (at your option) any later version.
     11 
     12 Quake III Arena source code is distributed in the hope that it will be
     13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with Foobar; if not, write to the Free Software
     19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     20 ===========================================================================
     21 */
     22 //
     23 #include "ui_local.h"
     24 
     25 #define SERVERINFO_FRAMEL	"menu/art/frame2_l"
     26 #define SERVERINFO_FRAMER	"menu/art/frame1_r"
     27 #define SERVERINFO_BACK0	"menu/art/back_0"
     28 #define SERVERINFO_BACK1	"menu/art/back_1"
     29 
     30 static char* serverinfo_artlist[] =
     31 {
     32 	SERVERINFO_FRAMEL,	
     33 	SERVERINFO_FRAMER,
     34 	SERVERINFO_BACK0,
     35 	SERVERINFO_BACK1,
     36 	NULL
     37 };
     38 
     39 #define ID_ADD	 100
     40 #define ID_BACK	 101
     41 
     42 typedef struct
     43 {
     44 	menuframework_s	menu;
     45 	menutext_s		banner;
     46 	menubitmap_s	framel;
     47 	menubitmap_s	framer;
     48 	menubitmap_s	back;
     49 	menutext_s		add;
     50 	char			info[MAX_INFO_STRING];
     51 	int				numlines;
     52 } serverinfo_t;
     53 
     54 static serverinfo_t	s_serverinfo;
     55 
     56 
     57 /*
     58 =================
     59 Favorites_Add
     60 
     61 Add current server to favorites
     62 =================
     63 */
     64 void Favorites_Add( void )
     65 {
     66 	char	adrstr[128];
     67 	char	serverbuff[128];
     68 	int		i;
     69 	int		best;
     70 
     71 	trap_Cvar_VariableStringBuffer( "cl_currentServerAddress", serverbuff, sizeof(serverbuff) );
     72 	if (!serverbuff[0])
     73 		return;
     74 
     75 	best = 0;
     76 	for (i=0; i<MAX_FAVORITESERVERS; i++)
     77 	{
     78 		trap_Cvar_VariableStringBuffer( va("server%d",i+1), adrstr, sizeof(adrstr) );
     79 		if (!Q_stricmp(serverbuff,adrstr))
     80 		{
     81 			// already in list
     82 			return;
     83 		}
     84 		
     85 		// use first empty or non-numeric available slot
     86 		if ((adrstr[0]  < '0' || adrstr[0] > '9' ) && !best)
     87 			best = i+1;
     88 	}
     89 
     90 	if (best)
     91 		trap_Cvar_Set( va("server%d",best), serverbuff);
     92 }
     93 
     94 
     95 /*
     96 =================
     97 ServerInfo_Event
     98 =================
     99 */
    100 static void ServerInfo_Event( void* ptr, int event )
    101 {
    102 	switch (((menucommon_s*)ptr)->id)
    103 	{
    104 		case ID_ADD:
    105 			if (event != QM_ACTIVATED)
    106 				break;
    107 		
    108 			Favorites_Add();
    109 			UI_PopMenu();
    110 			break;
    111 
    112 		case ID_BACK:
    113 			if (event != QM_ACTIVATED)
    114 				break;
    115 
    116 			UI_PopMenu();
    117 			break;
    118 	}
    119 }
    120 
    121 /*
    122 =================
    123 ServerInfo_MenuDraw
    124 =================
    125 */
    126 static void ServerInfo_MenuDraw( void )
    127 {
    128 	const char		*s;
    129 	char			key[MAX_INFO_KEY];
    130 	char			value[MAX_INFO_VALUE];
    131 	int				y;
    132 
    133 	y = SCREEN_HEIGHT/2 - s_serverinfo.numlines*(SMALLCHAR_HEIGHT)/2 - 20;
    134 	s = s_serverinfo.info;
    135 	while ( s ) {
    136 		Info_NextPair( &s, key, value );
    137 		if ( !key[0] ) {
    138 			break;
    139 		}
    140 
    141 		Q_strcat( key, MAX_INFO_KEY, ":" ); 
    142 
    143 		UI_DrawString(SCREEN_WIDTH*0.50 - 8,y,key,UI_RIGHT|UI_SMALLFONT,color_red);
    144 		UI_DrawString(SCREEN_WIDTH*0.50 + 8,y,value,UI_LEFT|UI_SMALLFONT,text_color_normal);
    145 
    146 		y += SMALLCHAR_HEIGHT;
    147 	}
    148 
    149 	Menu_Draw( &s_serverinfo.menu );
    150 }
    151 
    152 /*
    153 =================
    154 ServerInfo_MenuKey
    155 =================
    156 */
    157 static sfxHandle_t ServerInfo_MenuKey( int key )
    158 {
    159 	return ( Menu_DefaultKey( &s_serverinfo.menu, key ) );
    160 }
    161 
    162 /*
    163 =================
    164 ServerInfo_Cache
    165 =================
    166 */
    167 void ServerInfo_Cache( void )
    168 {
    169 	int	i;
    170 
    171 	// touch all our pics
    172 	for (i=0; ;i++)
    173 	{
    174 		if (!serverinfo_artlist[i])
    175 			break;
    176 		trap_R_RegisterShaderNoMip(serverinfo_artlist[i]);
    177 	}
    178 }
    179 
    180 /*
    181 =================
    182 UI_ServerInfoMenu
    183 =================
    184 */
    185 void UI_ServerInfoMenu( void )
    186 {
    187 	const char		*s;
    188 	char			key[MAX_INFO_KEY];
    189 	char			value[MAX_INFO_VALUE];
    190 
    191 	// zero set all our globals
    192 	memset( &s_serverinfo, 0 ,sizeof(serverinfo_t) );
    193 
    194 	ServerInfo_Cache();
    195 
    196 	s_serverinfo.menu.draw       = ServerInfo_MenuDraw;
    197 	s_serverinfo.menu.key        = ServerInfo_MenuKey;
    198 	s_serverinfo.menu.wrapAround = qtrue;
    199 	s_serverinfo.menu.fullscreen = qtrue;
    200 
    201 	s_serverinfo.banner.generic.type  = MTYPE_BTEXT;
    202 	s_serverinfo.banner.generic.x	  = 320;
    203 	s_serverinfo.banner.generic.y	  = 16;
    204 	s_serverinfo.banner.string		  = "SERVER INFO";
    205 	s_serverinfo.banner.color	      = color_white;
    206 	s_serverinfo.banner.style	      = UI_CENTER;
    207 
    208 	s_serverinfo.framel.generic.type  = MTYPE_BITMAP;
    209 	s_serverinfo.framel.generic.name  = SERVERINFO_FRAMEL;
    210 	s_serverinfo.framel.generic.flags = QMF_INACTIVE;
    211 	s_serverinfo.framel.generic.x	  = 0;  
    212 	s_serverinfo.framel.generic.y	  = 78;
    213 	s_serverinfo.framel.width  	      = 256;
    214 	s_serverinfo.framel.height  	  = 329;
    215 
    216 	s_serverinfo.framer.generic.type  = MTYPE_BITMAP;
    217 	s_serverinfo.framer.generic.name  = SERVERINFO_FRAMER;
    218 	s_serverinfo.framer.generic.flags = QMF_INACTIVE;
    219 	s_serverinfo.framer.generic.x	  = 376;
    220 	s_serverinfo.framer.generic.y	  = 76;
    221 	s_serverinfo.framer.width  	      = 256;
    222 	s_serverinfo.framer.height  	  = 334;
    223 
    224 	s_serverinfo.add.generic.type	  = MTYPE_PTEXT;
    225 	s_serverinfo.add.generic.flags    = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    226 	s_serverinfo.add.generic.callback = ServerInfo_Event;
    227 	s_serverinfo.add.generic.id	      = ID_ADD;
    228 	s_serverinfo.add.generic.x		  = 320;
    229 	s_serverinfo.add.generic.y		  = 371;
    230 	s_serverinfo.add.string  		  = "ADD TO FAVORITES";
    231 	s_serverinfo.add.style  		  = UI_CENTER|UI_SMALLFONT;
    232 	s_serverinfo.add.color			  =	color_red;
    233 	if( trap_Cvar_VariableValue( "sv_running" ) ) {
    234 		s_serverinfo.add.generic.flags |= QMF_GRAYED;
    235 	}
    236 
    237 	s_serverinfo.back.generic.type	   = MTYPE_BITMAP;
    238 	s_serverinfo.back.generic.name     = SERVERINFO_BACK0;
    239 	s_serverinfo.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
    240 	s_serverinfo.back.generic.callback = ServerInfo_Event;
    241 	s_serverinfo.back.generic.id	   = ID_BACK;
    242 	s_serverinfo.back.generic.x		   = 0;
    243 	s_serverinfo.back.generic.y		   = 480-64;
    244 	s_serverinfo.back.width  		   = 128;
    245 	s_serverinfo.back.height  		   = 64;
    246 	s_serverinfo.back.focuspic         = SERVERINFO_BACK1;
    247 
    248 	trap_GetConfigString( CS_SERVERINFO, s_serverinfo.info, MAX_INFO_STRING );
    249 
    250 	s_serverinfo.numlines = 0;
    251 	s = s_serverinfo.info;
    252 	while ( s ) {
    253 		Info_NextPair( &s, key, value );
    254 		if ( !key[0] ) {
    255 			break;
    256 		}
    257 		s_serverinfo.numlines++;
    258 	}
    259 
    260 	if (s_serverinfo.numlines > 16)
    261 		s_serverinfo.numlines = 16;
    262 
    263 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.banner );
    264 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framel );
    265 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framer );
    266 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.add );
    267 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.back );
    268 
    269 	UI_PushMenu( &s_serverinfo.menu );
    270 }
    271 
    272