// Copyright (C) 1999-2000 Id Software, Inc. // #include "ui_local.h" #define MAX_VIDEODRIVER_LINES 20 #define ID_ADD 100 #define ID_MAINMENU 101 #define ID_ARROWUP 102 #define ID_ARROWDWN 103 typedef struct { menuframework_s menu; menubitmap_s mainmenu; menubitmap_s add; char info[MAX_INFO_STRING]; qhandle_t cornerLower; int lineCnt; int lineStartCnt; menubitmap_s arrowdwn; menubitmap_s arrowup; menutext_s key1; menutext_s key2; menutext_s key3; menutext_s key4; menutext_s key5; menutext_s key6; menutext_s key7; menutext_s key8; menutext_s key9; menutext_s key10; menutext_s key11; menutext_s key12; menutext_s key13; menutext_s key14; menutext_s key15; menutext_s key16; menutext_s key17; menutext_s key18; menutext_s key19; menutext_s key20; menutext_s value1; menutext_s value2; menutext_s value3; menutext_s value4; menutext_s value5; menutext_s value6; menutext_s value7; menutext_s value8; menutext_s value9; menutext_s value10; menutext_s value11; menutext_s value12; menutext_s value13; menutext_s value14; menutext_s value15; menutext_s value16; menutext_s value17; menutext_s value18; menutext_s value19; menutext_s value20; char key[MAX_VIDEODRIVER_LINES][MAX_INFO_KEY]; char value[MAX_VIDEODRIVER_LINES][MAX_INFO_VALUE]; } serverinfo_t; static serverinfo_t s_serverinfo; static void ServerInfo_LinePrep( void); /* ================= Favorites_Add Add current server to favorites ================= */ void Favorites_Add( void ) { char adrstr[128]; char serverbuff[128]; int i; int best; trap_Cvar_VariableStringBuffer( "cl_currentServerAddress", serverbuff, sizeof(serverbuff) ); if (!serverbuff[0]) return; best = 0; for (i=0; i '9' ) && !best) best = i+1; } if (best) trap_Cvar_Set( va("server%d",best), serverbuff); } /* ================= ServerInfo_Event ================= */ static void ServerInfo_Event( void* ptr, int event ) { switch (((menucommon_s*)ptr)->id) { case ID_ADD: if (event != QM_ACTIVATED) break; Favorites_Add(); UI_PopMenu(); break; case ID_MAINMENU: if (event != QM_ACTIVATED) break; UI_PopMenu(); break; case ID_ARROWUP: if (event != QM_ACTIVATED) break; s_serverinfo.lineStartCnt--; if (s_serverinfo.lineStartCnt>=0) { ServerInfo_LinePrep(); s_serverinfo.arrowdwn.generic.flags &= ~QMF_HIDDEN; s_serverinfo.arrowdwn.generic.flags &= ~QMF_INACTIVE; } else { s_serverinfo.arrowup.generic.flags |= QMF_HIDDEN|QMF_INACTIVE; s_serverinfo.lineStartCnt=0; } break; case ID_ARROWDWN: if (event != QM_ACTIVATED) break; s_serverinfo.lineStartCnt++; if ((s_serverinfo.lineStartCnt + MAX_VIDEODRIVER_LINES) <=s_serverinfo.lineCnt) { ServerInfo_LinePrep(); s_serverinfo.arrowup.generic.flags &= ~QMF_HIDDEN; s_serverinfo.arrowup.generic.flags &= ~QMF_INACTIVE; } else { s_serverinfo.arrowdwn.generic.flags |= QMF_HIDDEN|QMF_INACTIVE; s_serverinfo.lineStartCnt = s_serverinfo.lineCnt - MAX_VIDEODRIVER_LINES; } break; } } /* ================= ServerInfoMenu_Graphics ================= */ void ServerInfoMenu_Graphics (void) { // Draw the basic screen layout UI_MenuFrame2(&s_serverinfo.menu); trap_R_SetColor( colorTable[CT_LTPURPLE1]); UI_DrawHandlePic(30,202, 47, 188, uis.whiteShader); trap_R_SetColor( colorTable[CT_LTPURPLE1]); UI_DrawHandlePic(250,400, 180, 20, uis.whiteShader); } /* ================= ServerInfo_MenuDraw ================= */ static void ServerInfo_MenuDraw( void ) { ServerInfoMenu_Graphics(); Menu_Draw( &s_serverinfo.menu ); } /* ================= ServerInfo_LinePrep ================= */ static void ServerInfo_LinePrep( void) { int i; const char *s; char key[MAX_INFO_KEY]; char value[MAX_INFO_VALUE]; menutext_s *hold_key,*hold_value; s = s_serverinfo.info; hold_key = &s_serverinfo.key1; hold_value = &s_serverinfo.value1; s_serverinfo.lineCnt = 0; i=0; while ( s ) { Info_NextPair( &s, key, value ); if (!key[0]) { break; } Q_strcat( key, MAX_INFO_KEY, ":" ); if ((s_serverinfo.lineStartCnt <= s_serverinfo.lineCnt) && (i < MAX_VIDEODRIVER_LINES)) { Q_strncpyz(s_serverinfo.key[i], key, sizeof(key)); Q_strncpyz(s_serverinfo.value[i], value, sizeof(value)); i++; } s_serverinfo.lineCnt++; } } /* ================= ServerInfo_MenuKey ================= */ static sfxHandle_t ServerInfo_MenuKey( int key ) { return ( Menu_DefaultKey( &s_serverinfo.menu, key ) ); } /* ================= ServerInfo_Cache ================= */ void ServerInfo_Cache( void ) { s_serverinfo.cornerLower = trap_R_RegisterShaderNoMip("menu/common/corner_ll_47_18.tga"); } /* ================= PlayerSettings_MenuInit ================= */ static void UI_ServerInfoMenu_Init(void) { int i,x,y; menutext_s *hold_key,*hold_value; // zero set all our globals memset( &s_serverinfo, 0 ,sizeof(serverinfo_t) ); ServerInfo_Cache(); s_serverinfo.menu.draw = ServerInfo_MenuDraw; s_serverinfo.menu.key = ServerInfo_MenuKey; s_serverinfo.menu.wrapAround = qtrue; s_serverinfo.menu.fullscreen = qtrue; s_serverinfo.menu.nitems = 0; s_serverinfo.menu.descX = MENU_DESC_X; s_serverinfo.menu.descY = MENU_DESC_Y; s_serverinfo.menu.listX = 230; s_serverinfo.menu.listY = 188; s_serverinfo.menu.titleX = MENU_TITLE_X; s_serverinfo.menu.titleY = MENU_TITLE_Y; s_serverinfo.menu.titleI = MNT_SERVERINFO_TITLE; s_serverinfo.menu.footNoteEnum = MNT_SERVERINFO; y = 400; // Button Data s_serverinfo.mainmenu.generic.type = MTYPE_BITMAP; s_serverinfo.mainmenu.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_serverinfo.mainmenu.generic.x = 90; s_serverinfo.mainmenu.generic.y = 400; s_serverinfo.mainmenu.generic.name = GRAPHIC_SQUARE; s_serverinfo.mainmenu.generic.id = ID_MAINMENU; s_serverinfo.mainmenu.generic.callback = ServerInfo_Event; s_serverinfo.mainmenu.width = MENU_BUTTON_MED_WIDTH; s_serverinfo.mainmenu.height = MENU_BUTTON_MED_HEIGHT; s_serverinfo.mainmenu.color = CT_DKPURPLE1; s_serverinfo.mainmenu.color2 = CT_LTPURPLE1; s_serverinfo.mainmenu.textX = MENU_BUTTON_TEXT_X; s_serverinfo.mainmenu.textY = MENU_BUTTON_TEXT_Y; s_serverinfo.mainmenu.textEnum = MBT_INGAMEMENU; s_serverinfo.mainmenu.textcolor = CT_BLACK; s_serverinfo.mainmenu.textcolor2 = CT_WHITE; s_serverinfo.add.generic.type = MTYPE_BITMAP; s_serverinfo.add.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_serverinfo.add.generic.x = 460; s_serverinfo.add.generic.y = y; s_serverinfo.add.generic.name = GRAPHIC_SQUARE; s_serverinfo.add.generic.id = ID_ADD; s_serverinfo.add.generic.callback = ServerInfo_Event; s_serverinfo.add.width = MENU_BUTTON_MED_WIDTH; s_serverinfo.add.height = MENU_BUTTON_MED_HEIGHT; s_serverinfo.add.color = CT_DKPURPLE1; s_serverinfo.add.color2 = CT_LTPURPLE1; s_serverinfo.add.textX = MENU_BUTTON_TEXT_X; s_serverinfo.add.textY = MENU_BUTTON_TEXT_Y; s_serverinfo.add.textEnum = MBT_ADDTOFAVS; s_serverinfo.add.textcolor = CT_BLACK; s_serverinfo.add.textcolor2 = CT_WHITE; s_serverinfo.arrowup.generic.type = MTYPE_BITMAP; s_serverinfo.arrowup.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_serverinfo.arrowup.generic.x = 270; s_serverinfo.arrowup.generic.y = y+2; s_serverinfo.arrowup.generic.name = "menu/common/arrow_up_16.tga"; s_serverinfo.arrowup.generic.id = ID_ARROWUP; s_serverinfo.arrowup.generic.callback = ServerInfo_Event; s_serverinfo.arrowup.width = 16; s_serverinfo.arrowup.height = 16; s_serverinfo.arrowup.color = CT_DKBLUE1; s_serverinfo.arrowup.color2 = CT_LTBLUE1; s_serverinfo.arrowup.textX = 0; s_serverinfo.arrowup.textY = 0; s_serverinfo.arrowup.textEnum = MBT_NONE; s_serverinfo.arrowup.textcolor = CT_BLACK; s_serverinfo.arrowup.textcolor2 = CT_WHITE; s_serverinfo.arrowdwn.generic.type = MTYPE_BITMAP; s_serverinfo.arrowdwn.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_serverinfo.arrowdwn.generic.x = 394; s_serverinfo.arrowdwn.generic.y = y+2; s_serverinfo.arrowdwn.generic.name = "menu/common/arrow_dn_16.tga"; s_serverinfo.arrowdwn.generic.id = ID_ARROWDWN; s_serverinfo.arrowdwn.generic.callback = ServerInfo_Event; s_serverinfo.arrowdwn.width = 16; s_serverinfo.arrowdwn.height = 16; s_serverinfo.arrowdwn.color = CT_DKBLUE1; s_serverinfo.arrowdwn.color2 = CT_LTBLUE1; s_serverinfo.arrowdwn.textX = 0; s_serverinfo.arrowdwn.textY = 0; s_serverinfo.arrowdwn.textEnum = MBT_NONE; s_serverinfo.arrowdwn.textcolor = CT_BLACK; s_serverinfo.arrowdwn.textcolor2 = CT_WHITE; Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.mainmenu ); Menu_AddItem( &s_serverinfo.menu, (void*) &s_serverinfo.add ); Menu_AddItem( &s_serverinfo.menu,( void * ) &s_serverinfo.arrowup); Menu_AddItem( &s_serverinfo.menu, ( void * ) &s_serverinfo.arrowdwn); s_serverinfo.lineStartCnt = 0; hold_key = &s_serverinfo.key1; hold_value = &s_serverinfo.value1; y = 62; x = SCREEN_WIDTH*0.50; for (i=0;igeneric.x = x-8; hold_key->generic.y = y; hold_key->generic.type = MTYPE_TEXT; hold_key->generic.flags = UI_RIGHT|UI_SMALLFONT; hold_key->color = colorTable[CT_LTBLUE2]; hold_key->string = s_serverinfo.key[i]; hold_key->style = UI_RIGHT|UI_SMALLFONT; hold_value->generic.x = x+8; hold_value->generic.y = y; hold_value->generic.type = MTYPE_TEXT; hold_value->generic.flags = UI_LEFT|UI_SMALLFONT; hold_value->color = colorTable[CT_LTGOLD1]; hold_value->string = s_serverinfo.value[i]; hold_value->style = UI_LEFT|UI_SMALLFONT; Menu_AddItem( &s_serverinfo.menu, ( void * ) hold_key); Menu_AddItem( &s_serverinfo.menu, ( void * ) hold_value); y += SMALLCHAR_HEIGHT; ++hold_key; ++hold_value; } if( trap_Cvar_VariableValue( "sv_running" ) ) { s_serverinfo.add.generic.flags |= QMF_GRAYED; } trap_GetConfigString( CS_SERVERINFO, s_serverinfo.info, MAX_INFO_STRING ); ServerInfo_LinePrep(); s_serverinfo.arrowup.generic.flags |= QMF_HIDDEN|QMF_INACTIVE; } /* ================= UI_ServerInfoMenu ================= */ void UI_ServerInfoMenu( void ) { UI_ServerInfoMenu_Init(); UI_PushMenu( &s_serverinfo.menu ); }