rpg-x2/ui/ui_serverinfo.c
2011-06-01 14:20:56 +02:00

427 lines
11 KiB
C

// 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<MAX_FAVORITESERVERS; i++)
{
trap_Cvar_VariableStringBuffer( va("server%d",i+1), adrstr, sizeof(adrstr) );
if (!Q_stricmp(serverbuff,adrstr))
{
// already in list
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);
}
/*
=================
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;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_ServerInfoMenu
=================
*/
void UI_ServerInfoMenu( void )
{
UI_ServerInfoMenu_Init();
UI_PushMenu( &s_serverinfo.menu );
}