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