/* =========================================================================== Copyright (C) 1999-2005 Id Software, Inc. Copyright (C) 2002-2021 Q3Rally Team (Per Thormann - q3rally@gmail.com) This file is part of q3rally source code. q3rally source code is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. q3rally source code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with q3rally; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA =========================================================================== */ // #include "ui_local.h" /********************************************************************************* SPECIFY SERVER *********************************************************************************/ #define MAX_LISTBOXITEMS 128 #define MAX_LISTBOXWIDTH 40 #define MAX_LEAGUENAME 80 #define SPECIFYLEAGUE_FRAMEL "menu/art/frame2_l" #define SPECIFYLEAGUE_FRAMER "menu/art/frame1_r" #define SPECIFYLEAGUE_BACK0 "menu/art/back_0" #define SPECIFYLEAGUE_BACK1 "menu/art/back_1" #define SPECIFYLEAGUE_ARROWS0 "menu/art/arrows_vert_0" #define SPECIFYLEAGUE_UP "menu/art/arrows_vert_top" #define SPECIFYLEAGUE_DOWN "menu/art/arrows_vert_bot" #define GLOBALRANKINGS_LOGO "menu/art/gr/grlogo" #define GLOBALRANKINGS_LETTERS "menu/art/gr/grletters" #define ID_SPECIFYLEAGUENAME 100 #define ID_SPECIFYLEAGUELIST 101 #define ID_SPECIFYLEAGUEUP 102 #define ID_SPECIFYLEAGUEDOWN 103 #define ID_SPECIFYLEAGUEBACK 104 static char* specifyleague_artlist[] = { SPECIFYLEAGUE_FRAMEL, SPECIFYLEAGUE_FRAMER, SPECIFYLEAGUE_ARROWS0, SPECIFYLEAGUE_UP, SPECIFYLEAGUE_DOWN, SPECIFYLEAGUE_BACK0, SPECIFYLEAGUE_BACK1, GLOBALRANKINGS_LOGO, GLOBALRANKINGS_LETTERS, NULL }; static char playername[80]; typedef struct { menuframework_s menu; menutext_s banner; menubitmap_s framel; menubitmap_s framer; menufield_s rankname; menulist_s list; menubitmap_s arrows; menubitmap_s up; menubitmap_s down; menubitmap_s back; menubitmap_s grlogo; menubitmap_s grletters; } specifyleague_t; static specifyleague_t s_specifyleague; typedef struct { char buff[MAX_LISTBOXWIDTH]; char leaguename[MAX_LEAGUENAME]; } table_t; table_t league_table[MAX_LISTBOXITEMS]; char *leaguename_items[MAX_LISTBOXITEMS]; static void SpecifyLeague_GetList() { int count = 0; int i; /* The Player Name has changed. We need to perform another search */ Q_strncpyz( playername, s_specifyleague.rankname.field.buffer, sizeof(playername) ); count = trap_CL_UI_RankGetLeauges( playername ); for(i = 0; i < count; i++) { char s[MAX_LEAGUENAME]; const char *var; var = va( "leaguename%i", i+1 ); trap_Cvar_VariableStringBuffer( var, s, sizeof(s) ); Q_strncpyz(league_table[i].leaguename, s, sizeof(league_table[i].leaguename) ); Q_strncpyz(league_table[i].buff, league_table[i].leaguename, sizeof(league_table[i].buff) ); } s_specifyleague.list.numitems = count; } /* ================= SpecifyLeague_Event ================= */ static void SpecifyLeague_Event( void* ptr, int event ) { int id; id = ((menucommon_s*)ptr)->id; //if( event != QM_ACTIVATED && id != ID_SPECIFYLEAGUELIST ) { // return; //} switch (id) { case ID_SPECIFYLEAGUELIST: if( event == QM_GOTFOCUS ) { //ArenaServers_UpdatePicture(); } break; case ID_SPECIFYLEAGUEUP: if( event == QM_ACTIVATED ) ScrollList_Key( &s_specifyleague.list, K_UPARROW ); break; case ID_SPECIFYLEAGUEDOWN: if( event == QM_ACTIVATED ) ScrollList_Key( &s_specifyleague.list, K_DOWNARROW ); break; case ID_SPECIFYLEAGUENAME: if( (event == QM_LOSTFOCUS) && (Q_strncmp(playername, s_specifyleague.rankname.field.buffer, strlen(s_specifyleague.rankname.field.buffer)) != 0)) { SpecifyLeague_GetList(); } break; case ID_SPECIFYLEAGUEBACK: if( event == QM_ACTIVATED ) { trap_Cvar_Set( "sv_leagueName", league_table[s_specifyleague.list.curvalue].leaguename); UI_PopMenu(); } break; } } /* ================= SpecifyLeague_MenuInit ================= */ void SpecifyLeague_MenuInit( void ) { int i; // zero set all our globals memset( &s_specifyleague, 0 ,sizeof(specifyleague_t) ); SpecifyLeague_Cache(); s_specifyleague.menu.wrapAround = qtrue; s_specifyleague.menu.fullscreen = qtrue; s_specifyleague.banner.generic.type = MTYPE_BTEXT; s_specifyleague.banner.generic.x = 320; s_specifyleague.banner.generic.y = 16; s_specifyleague.banner.string = "CHOOSE LEAGUE"; s_specifyleague.banner.color = color_white; s_specifyleague.banner.style = UI_CENTER; s_specifyleague.framel.generic.type = MTYPE_BITMAP; s_specifyleague.framel.generic.name = SPECIFYLEAGUE_FRAMEL; s_specifyleague.framel.generic.flags = QMF_INACTIVE; s_specifyleague.framel.generic.x = 0; s_specifyleague.framel.generic.y = 78; s_specifyleague.framel.width = 256; s_specifyleague.framel.height = 334; s_specifyleague.framer.generic.type = MTYPE_BITMAP; s_specifyleague.framer.generic.name = SPECIFYLEAGUE_FRAMER; s_specifyleague.framer.generic.flags = QMF_INACTIVE; s_specifyleague.framer.generic.x = 376; s_specifyleague.framer.generic.y = 76; s_specifyleague.framer.width = 256; s_specifyleague.framer.height = 334; s_specifyleague.grlogo.generic.type = MTYPE_BITMAP; s_specifyleague.grlogo.generic.name = GLOBALRANKINGS_LOGO; s_specifyleague.grlogo.generic.flags = QMF_INACTIVE; s_specifyleague.grlogo.generic.x = 0; s_specifyleague.grlogo.generic.y = 0; s_specifyleague.grlogo.width = 64; s_specifyleague.grlogo.height = 128; s_specifyleague.rankname.generic.type = MTYPE_FIELD; s_specifyleague.rankname.generic.name = "Player Name:"; s_specifyleague.rankname.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT; s_specifyleague.rankname.generic.callback = SpecifyLeague_Event; s_specifyleague.rankname.generic.id = ID_SPECIFYLEAGUENAME; s_specifyleague.rankname.generic.x = 226; s_specifyleague.rankname.generic.y = 128; s_specifyleague.rankname.field.widthInChars = 32; s_specifyleague.rankname.field.maxchars = 80; s_specifyleague.list.generic.type = MTYPE_SCROLLLIST; s_specifyleague.list.generic.flags = QMF_HIGHLIGHT_IF_FOCUS; s_specifyleague.list.generic.id = ID_SPECIFYLEAGUELIST; s_specifyleague.list.generic.callback = SpecifyLeague_Event; s_specifyleague.list.generic.x = 160; s_specifyleague.list.generic.y = 200; s_specifyleague.list.width = MAX_LISTBOXWIDTH; s_specifyleague.list.height = 8; s_specifyleague.list.itemnames = (const char **)leaguename_items; s_specifyleague.list.numitems = 0; for( i = 0; i < MAX_LISTBOXITEMS; i++ ) { league_table[i].buff[0] = 0; league_table[i].leaguename[0] = 0; leaguename_items[i] = league_table[i].buff; } s_specifyleague.arrows.generic.type = MTYPE_BITMAP; s_specifyleague.arrows.generic.name = SPECIFYLEAGUE_ARROWS0; s_specifyleague.arrows.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE; s_specifyleague.arrows.generic.callback = SpecifyLeague_Event; s_specifyleague.arrows.generic.x = 512; s_specifyleague.arrows.generic.y = 240-64+16; s_specifyleague.arrows.width = 64; s_specifyleague.arrows.height = 128; s_specifyleague.up.generic.type = MTYPE_BITMAP; s_specifyleague.up.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY; s_specifyleague.up.generic.callback = SpecifyLeague_Event; s_specifyleague.up.generic.id = ID_SPECIFYLEAGUEUP; s_specifyleague.up.generic.x = 512; s_specifyleague.up.generic.y = 240-64+16; s_specifyleague.up.width = 64; s_specifyleague.up.height = 64; s_specifyleague.up.focuspic = SPECIFYLEAGUE_UP; s_specifyleague.down.generic.type = MTYPE_BITMAP; s_specifyleague.down.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_MOUSEONLY; s_specifyleague.down.generic.callback = SpecifyLeague_Event; s_specifyleague.down.generic.id = ID_SPECIFYLEAGUEDOWN; s_specifyleague.down.generic.x = 512; s_specifyleague.down.generic.y = 240+16; s_specifyleague.down.width = 64; s_specifyleague.down.height = 64; s_specifyleague.down.focuspic = SPECIFYLEAGUE_DOWN; s_specifyleague.back.generic.type = MTYPE_BITMAP; s_specifyleague.back.generic.name = SPECIFYLEAGUE_BACK0; s_specifyleague.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS; s_specifyleague.back.generic.callback = SpecifyLeague_Event; s_specifyleague.back.generic.id = ID_SPECIFYLEAGUEBACK; s_specifyleague.back.generic.x = 0; s_specifyleague.back.generic.y = 480-64; s_specifyleague.back.width = 128; s_specifyleague.back.height = 64; s_specifyleague.back.focuspic = SPECIFYLEAGUE_BACK1; Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.banner ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.framel ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.framer ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.grlogo ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.rankname ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.list ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.arrows ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.up ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.down ); Menu_AddItem( &s_specifyleague.menu, &s_specifyleague.back ); // initialize any menu variables Q_strncpyz( s_specifyleague.rankname.field.buffer, UI_Cvar_VariableString("name"), sizeof(s_specifyleague.rankname.field.buffer) ); Q_strncpyz( playername, UI_Cvar_VariableString("name"), sizeof(playername) ); SpecifyLeague_GetList(); } /* ================= SpecifyLeague_Cache ================= */ void SpecifyLeague_Cache( void ) { int i; // touch all our pics for (i=0; ;i++) { if (!specifyleague_artlist[i]) break; trap_R_RegisterShaderNoMip(specifyleague_artlist[i]); } } /* ================= UI_SpecifyLeagueMenu ================= */ void UI_SpecifyLeagueMenu( void ) { SpecifyLeague_MenuInit(); UI_PushMenu( &s_specifyleague.menu ); }