mirror of
https://github.com/UberGames/rpgxEF.git
synced 2025-02-24 04:51:12 +00:00
444 lines
10 KiB
C
444 lines
10 KiB
C
// 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();
|
|
}
|
|
|
|
|