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 Quake III Arena source code; 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 */
Favorites_Add(void)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 */
ServerInfo_Event(void * ptr,int event)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 */
ServerInfo_MenuDraw(void)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				i = 0, y;
132 
133 	y = SCREEN_HEIGHT/2 - s_serverinfo.numlines*(SMALLCHAR_HEIGHT)/2 - 20;
134 	s = s_serverinfo.info;
135 	while ( s && i < s_serverinfo.numlines ) {
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 		i++;
148 	}
149 
150 	Menu_Draw( &s_serverinfo.menu );
151 }
152 
153 /*
154 =================
155 ServerInfo_MenuKey
156 =================
157 */
ServerInfo_MenuKey(int key)158 static sfxHandle_t ServerInfo_MenuKey( int key )
159 {
160 	return ( Menu_DefaultKey( &s_serverinfo.menu, key ) );
161 }
162 
163 /*
164 =================
165 ServerInfo_Cache
166 =================
167 */
ServerInfo_Cache(void)168 void ServerInfo_Cache( void )
169 {
170 	int	i;
171 
172 	// touch all our pics
173 	for (i=0; ;i++)
174 	{
175 		if (!serverinfo_artlist[i])
176 			break;
177 		trap_R_RegisterShaderNoMip(serverinfo_artlist[i]);
178 	}
179 }
180 
181 /*
182 =================
183 UI_ServerInfoMenu
184 =================
185 */
UI_ServerInfoMenu(void)186 void UI_ServerInfoMenu( void )
187 {
188 	const char		*s;
189 	char			key[MAX_INFO_KEY];
190 	char			value[MAX_INFO_VALUE];
191 
192 	// zero set all our globals
193 	memset( &s_serverinfo, 0 ,sizeof(serverinfo_t) );
194 
195 	ServerInfo_Cache();
196 
197 	s_serverinfo.menu.draw       = ServerInfo_MenuDraw;
198 	s_serverinfo.menu.key        = ServerInfo_MenuKey;
199 	s_serverinfo.menu.wrapAround = qtrue;
200 	s_serverinfo.menu.fullscreen = qtrue;
201 
202 	s_serverinfo.banner.generic.type  = MTYPE_BTEXT;
203 	s_serverinfo.banner.generic.x	  = 320;
204 	s_serverinfo.banner.generic.y	  = 16;
205 	s_serverinfo.banner.string		  = "SERVER INFO";
206 	s_serverinfo.banner.color	      = color_white;
207 	s_serverinfo.banner.style	      = UI_CENTER;
208 
209 	s_serverinfo.framel.generic.type  = MTYPE_BITMAP;
210 	s_serverinfo.framel.generic.name  = SERVERINFO_FRAMEL;
211 	s_serverinfo.framel.generic.flags = QMF_INACTIVE;
212 	s_serverinfo.framel.generic.x	  = 0;
213 	s_serverinfo.framel.generic.y	  = 78;
214 	s_serverinfo.framel.width  	      = 256;
215 	s_serverinfo.framel.height  	  = 329;
216 
217 	s_serverinfo.framer.generic.type  = MTYPE_BITMAP;
218 	s_serverinfo.framer.generic.name  = SERVERINFO_FRAMER;
219 	s_serverinfo.framer.generic.flags = QMF_INACTIVE;
220 	s_serverinfo.framer.generic.x	  = 376;
221 	s_serverinfo.framer.generic.y	  = 76;
222 	s_serverinfo.framer.width  	      = 256;
223 	s_serverinfo.framer.height  	  = 334;
224 
225 	s_serverinfo.add.generic.type	  = MTYPE_PTEXT;
226 	s_serverinfo.add.generic.flags    = QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
227 	s_serverinfo.add.generic.callback = ServerInfo_Event;
228 	s_serverinfo.add.generic.id	      = ID_ADD;
229 	s_serverinfo.add.generic.x		  = 320;
230 	s_serverinfo.add.generic.y		  = 371;
231 	s_serverinfo.add.string  		  = "ADD TO FAVORITES";
232 	s_serverinfo.add.style  		  = UI_CENTER|UI_SMALLFONT;
233 	s_serverinfo.add.color			  =	color_red;
234 	if( trap_Cvar_VariableValue( "sv_running" ) ) {
235 		s_serverinfo.add.generic.flags |= QMF_GRAYED;
236 	}
237 
238 	s_serverinfo.back.generic.type	   = MTYPE_BITMAP;
239 	s_serverinfo.back.generic.name     = SERVERINFO_BACK0;
240 	s_serverinfo.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
241 	s_serverinfo.back.generic.callback = ServerInfo_Event;
242 	s_serverinfo.back.generic.id	   = ID_BACK;
243 	s_serverinfo.back.generic.x		   = 0;
244 	s_serverinfo.back.generic.y		   = 480-64;
245 	s_serverinfo.back.width  		   = 128;
246 	s_serverinfo.back.height  		   = 64;
247 	s_serverinfo.back.focuspic         = SERVERINFO_BACK1;
248 
249 	trap_GetConfigString( CS_SERVERINFO, s_serverinfo.info, MAX_INFO_STRING );
250 
251 	s_serverinfo.numlines = 0;
252 	s = s_serverinfo.info;
253 	while ( s ) {
254 		Info_NextPair( &s, key, value );
255 		if ( !key[0] ) {
256 			break;
257 		}
258 		s_serverinfo.numlines++;
259 	}
260 
261 	if (s_serverinfo.numlines > 16)
262 		s_serverinfo.numlines = 16;
263 
264 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.banner );
265 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framel );
266 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.framer );
267 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.add );
268 	Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.back );
269 
270 	UI_PushMenu( &s_serverinfo.menu );
271 }
272 
273 
274