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