// Copyright (C) 1999-2000 Id Software, Inc. // #include "ui_local.h" #include "ui_logger.h" enum ui_serverinfoLimits_e { MAX_VIDEODRIVER_LINES = 20 }; enum ui_serverinfoIDs_e { ID_ADD = 100, ID_MAINMENU, ID_ARROWUP, ID_ARROWDWN }; typedef struct { menuframework_s menu; menubitmap_s mainmenu; menubitmap_s add; char info[MAX_INFO_STRING]; qhandle_t cornerLower; int32_t lineCnt; int32_t 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) { UI_LogFuncBegin(); char adrstr[128]; char serverbuff[128]; int32_t i; int32_t best; trap_Cvar_VariableStringBuffer("cl_currentServerAddress", serverbuff, sizeof(serverbuff)); if (!serverbuff[0]){ UI_LogFuncEnd(); return; } best = 0; for (i = 0; i < MAX_FAVORITESERVERS; i++) { trap_Cvar_VariableStringBuffer(va("server%d", i + 1), adrstr, sizeof(adrstr)); if (!Q_stricmp(serverbuff, adrstr)) { // already in list UI_LogFuncEnd(); return; } // use first empty or non-numeric available slot if ((adrstr[0] < '0' || adrstr[0] > '9') && !best) best = i + 1; } if (best) trap_Cvar_Set(va("server%d", best), serverbuff); UI_LogFuncEnd(); } /* ================= ServerInfo_Event ================= */ static void ServerInfo_Event(void* ptr, int32_t event) { UI_LogFuncBegin(); 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; } UI_LogFuncEnd(); } /* ================= ServerInfoMenu_Graphics ================= */ void ServerInfoMenu_Graphics(void) { UI_LogFuncBegin(); // 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); UI_LogFuncEnd(); } /* ================= ServerInfo_MenuDraw ================= */ static void ServerInfo_MenuDraw(void) { UI_LogFuncBegin(); ServerInfoMenu_Graphics(); Menu_Draw(&s_serverinfo.menu); UI_LogFuncEnd(); } /* ================= ServerInfo_LinePrep ================= */ static void ServerInfo_LinePrep(void) { UI_LogFuncBegin(); int32_t i; const char *s; char key[MAX_INFO_KEY]; char value[MAX_INFO_VALUE]; s = s_serverinfo.info; 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++; } UI_LogFuncEnd(); } /* ================= ServerInfo_MenuKey ================= */ static sfxHandle_t ServerInfo_MenuKey(int32_t 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) { UI_LogFuncBegin(); int32_t 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; i < MAX_VIDEODRIVER_LINES; i++) { hold_key->generic.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_LogFuncEnd(); } /* ================= UI_ServerInfoMenu ================= */ void UI_ServerInfoMenu(void) { UI_LogFuncBegin(); UI_ServerInfoMenu_Init(); UI_PushMenu(&s_serverinfo.menu); UI_LogFuncEnd(); }