Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_rankings.c (10103B)


      1 /*
      2 ===========================================================================
      3 Copyright (C) 1999-2005 Id Software, Inc.
      4 
      5 This file is part of Quake III Arena source code.
      6 
      7 Quake III Arena source code is free software; you can redistribute it
      8 and/or modify it under the terms of the GNU General Public License as
      9 published by the Free Software Foundation; either version 2 of the License,
     10 or (at your option) any later version.
     11 
     12 Quake III Arena source code is distributed in the hope that it will be
     13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with Foobar; if not, write to the Free Software
     19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     20 ===========================================================================
     21 */
     22 //
     23 //
     24 // ui_rankings.c
     25 //
     26 
     27 #include "ui_local.h"
     28 
     29 
     30 #define RANKINGS_FRAME	"menu/art/cut_frame"
     31 
     32 #define ID_LOGIN		100
     33 #define ID_LOGOUT		101
     34 #define ID_CREATE		102
     35 #define ID_SPECTATE		103
     36 #define ID_SETUP		104
     37 #define ID_LEAVE		105
     38 
     39 
     40 typedef struct
     41 {
     42 	menuframework_s	menu;
     43 	menubitmap_s	frame;
     44 	menutext_s		login;
     45 	menutext_s		logout;
     46 	menutext_s		create;
     47 	menutext_s		spectate;
     48 	menutext_s		setup;
     49 	menutext_s		leave;
     50 } rankings_t;
     51 
     52 static rankings_t	s_rankings;
     53 
     54 static menuframework_s	s_rankings_menu;
     55 static menuaction_s		s_rankings_login;
     56 static menuaction_s		s_rankings_logout;
     57 static menuaction_s		s_rankings_create;
     58 static menuaction_s		s_rankings_spectate;
     59 static menuaction_s		s_rankings_setup;
     60 static menuaction_s		s_rankings_leave;
     61 
     62 
     63 /*
     64 ===============
     65 Rankings_DrawText
     66 ===============
     67 */
     68 void Rankings_DrawText( void* self )
     69 {
     70 	menufield_s		*f;
     71 	qboolean		focus;
     72 	int				style;
     73 	char			*txt;
     74 	char			c;
     75 	float			*color;
     76 	int				basex, x, y;
     77 
     78 	f = (menufield_s*)self;
     79 	basex = f->generic.x;
     80 	y = f->generic.y + 4;
     81 	focus = (f->generic.parent->cursor == f->generic.menuPosition);
     82 
     83 	style = UI_LEFT|UI_SMALLFONT;
     84 	color = text_color_normal;
     85 	if( focus ) {
     86 		style |= UI_PULSE;
     87 		color = text_color_highlight;
     88 	}
     89 
     90 	// draw the actual text
     91 	txt = f->field.buffer;
     92 	color = g_color_table[ColorIndex(COLOR_WHITE)];
     93 	x = basex;
     94 	while ( (c = *txt) != 0 ) {
     95 		UI_DrawChar( x, y, c, style, color );
     96 		txt++;
     97 		x += SMALLCHAR_WIDTH;
     98 	}
     99 
    100 	// draw cursor if we have focus
    101 	if( focus ) {
    102 		if ( trap_Key_GetOverstrikeMode() ) {
    103 			c = 11;
    104 		} else {
    105 			c = 10;
    106 		}
    107 
    108 		style &= ~UI_PULSE;
    109 		style |= UI_BLINK;
    110 
    111 		UI_DrawChar( basex + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white );
    112 	}
    113 }
    114 
    115 /*
    116 ===============
    117 Rankings_DrawName
    118 ===============
    119 */
    120 void Rankings_DrawName( void* self )
    121 {
    122 	menufield_s		*f;
    123 	int				length;
    124 	char*			p;
    125 	
    126 	f = (menufield_s*)self;
    127 
    128 	// GRANK_FIXME - enforce valid characters
    129 	for( p = f->field.buffer; *p != '\0'; p++ )
    130 	{
    131 		//if( ispunct(*p) || isspace(*p) )
    132 		if( !( ( (*p) >= '0' && (*p) <= '9') || Q_isalpha(*p)) )
    133 		{
    134 			*p = '\0';
    135 		}
    136 	}
    137 	
    138 	// strip color codes
    139 	Q_CleanStr( f->field.buffer );
    140 	length = strlen( f->field.buffer );
    141 	if( f->field.cursor > length )
    142 	{
    143 		f->field.cursor = length;
    144 	}	
    145 
    146 	Rankings_DrawText( f );
    147 }
    148 
    149 #if 0 // old version
    150 /*
    151 ===============
    152 Rankings_DrawName
    153 ===============
    154 */
    155 void Rankings_DrawName( void* self )
    156 {
    157 	menufield_s*	f;
    158 	int				length;
    159 	
    160 	f = (menufield_s*)self;
    161 
    162 	// strip color codes
    163 	Q_CleanStr( f->field.buffer );
    164 	length = strlen( f->field.buffer );
    165 	if( f->field.cursor > length )
    166 	{
    167 		f->field.cursor = length;
    168 	}
    169 	
    170 	// show beginning of long names
    171 	/*
    172 	if( Menu_ItemAtCursor( f->generic.parent ) != f )
    173 	{
    174 		if( f->field.scroll > 0 )
    175 		{
    176 			f->field.cursor = 0;
    177 			f->field.scroll = 0;
    178 		}
    179 	}
    180 	*/
    181 	
    182 	MenuField_Draw( f );
    183 }
    184 #endif
    185 
    186 /*
    187 ===============
    188 Rankings_DrawPassword
    189 ===============
    190 */
    191 void Rankings_DrawPassword( void* self )
    192 {
    193 	menufield_s*	f;
    194 	char			password[MAX_EDIT_LINE];
    195 	int				length;
    196 	int				i;
    197 	char*			p;
    198 
    199 	f = (menufield_s*)self;
    200 	
    201 	// GRANK_FIXME - enforce valid characters
    202 	for( p = f->field.buffer; *p != '\0'; p++ )
    203 	{
    204 		//if( ispunct(*p) || isspace(*p) )
    205 		if( !( ( (*p) >= '0' && (*p) <= '9') || Q_isalpha(*p)) )
    206 		{
    207 			*p = '\0';
    208 		}
    209 	}
    210 	
    211 	length = strlen( f->field.buffer );
    212 	if( f->field.cursor > length )
    213 	{
    214 		f->field.cursor = length;
    215 	}
    216 	
    217 	// save password
    218 	Q_strncpyz( password, f->field.buffer, sizeof(password) );
    219 
    220 	// mask password with *
    221 	for( i = 0; i < length; i++ )
    222 	{
    223 		f->field.buffer[i] = '*';
    224 	}
    225 
    226 	// draw masked password
    227 	Rankings_DrawText( f );
    228 	//MenuField_Draw( f );
    229 
    230 	// restore password
    231 	Q_strncpyz( f->field.buffer, password, sizeof(f->field.buffer) );
    232 }
    233 
    234 /*
    235 ===============
    236 Rankings_MenuEvent
    237 ===============
    238 */
    239 static void Rankings_MenuEvent( void* ptr, int event ) {
    240 	if( event != QM_ACTIVATED ) {
    241 		return;
    242 	}
    243 
    244 	switch( ((menucommon_s*)ptr)->id ) {
    245 	case ID_LOGIN:
    246 		UI_LoginMenu();
    247 		break;
    248 
    249 	case ID_LOGOUT:
    250 		// server side masqueraded player logout first
    251 		trap_CL_UI_RankUserRequestLogout();
    252 		UI_ForceMenuOff();
    253 		break;
    254 		
    255 	case ID_CREATE:
    256 		UI_SignupMenu();
    257 		break;
    258 
    259 	case ID_SPECTATE:
    260 		trap_Cmd_ExecuteText( EXEC_APPEND, "cmd rank_spectate\n" );
    261 		UI_ForceMenuOff();
    262 		break;
    263 
    264 	case ID_SETUP:
    265 		UI_SetupMenu();
    266 		break;
    267 		
    268 	case ID_LEAVE:
    269 		trap_Cmd_ExecuteText( EXEC_APPEND, "disconnect\n" );
    270 		UI_ForceMenuOff();
    271 		break;
    272 
    273 	}
    274 }
    275 
    276 
    277 /*
    278 ===============
    279 Rankings_MenuInit
    280 ===============
    281 */
    282 void Rankings_MenuInit( void ) {
    283 	grank_status_t	status;
    284 	int				y;
    285 
    286 	memset( &s_rankings, 0, sizeof(s_rankings) );
    287 
    288 	Rankings_Cache();
    289 
    290 	s_rankings.menu.wrapAround = qtrue;
    291 	s_rankings.menu.fullscreen = qfalse;
    292 
    293 	s_rankings.frame.generic.type		= MTYPE_BITMAP;
    294 	s_rankings.frame.generic.flags		= QMF_INACTIVE;
    295 	s_rankings.frame.generic.name		= RANKINGS_FRAME;
    296 	s_rankings.frame.generic.x			= 142;
    297 	s_rankings.frame.generic.y			= 118;
    298 	s_rankings.frame.width				= 359;
    299 	s_rankings.frame.height				= 256;
    300 
    301 	y = 194;
    302 
    303 	s_rankings.login.generic.type		= MTYPE_PTEXT;
    304 	s_rankings.login.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    305 	s_rankings.login.generic.id			= ID_LOGIN;
    306 	s_rankings.login.generic.callback	= Rankings_MenuEvent;
    307 	s_rankings.login.generic.x			= 320;
    308 	s_rankings.login.generic.y			= y;
    309 	s_rankings.login.string				= "LOGIN";
    310 	s_rankings.login.style				= UI_CENTER|UI_SMALLFONT;
    311 	s_rankings.login.color				= colorRed;
    312 	y += 20;
    313 
    314 	s_rankings.logout.generic.type		= MTYPE_PTEXT;
    315 	s_rankings.logout.generic.flags		= QMF_HIDDEN|QMF_INACTIVE|QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    316 	s_rankings.logout.generic.id		= ID_LOGOUT;
    317 	s_rankings.logout.generic.callback	= Rankings_MenuEvent;
    318 	s_rankings.logout.generic.x			= 320;
    319 	s_rankings.logout.generic.y			= y;
    320 	s_rankings.logout.string				= "LOGOUT";
    321 	s_rankings.logout.style				= UI_CENTER|UI_SMALLFONT;
    322 	s_rankings.logout.color				= colorRed;
    323 
    324 	s_rankings.create.generic.type		= MTYPE_PTEXT;
    325 	s_rankings.create.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    326 	s_rankings.create.generic.id		= ID_CREATE;
    327 	s_rankings.create.generic.callback	= Rankings_MenuEvent;
    328 	s_rankings.create.generic.x			= 320;
    329 	s_rankings.create.generic.y			= y;
    330 	s_rankings.create.string			= "SIGN UP";
    331 	s_rankings.create.style				= UI_CENTER|UI_SMALLFONT;
    332 	s_rankings.create.color				= colorRed;
    333 	y += 20;
    334 
    335 	s_rankings.spectate.generic.type		= MTYPE_PTEXT;
    336 	s_rankings.spectate.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    337 	s_rankings.spectate.generic.id			= ID_SPECTATE;
    338 	s_rankings.spectate.generic.callback	= Rankings_MenuEvent;
    339 	s_rankings.spectate.generic.x			= 320;
    340 	s_rankings.spectate.generic.y			= y;
    341 	s_rankings.spectate.string				= "SPECTATE";
    342 	s_rankings.spectate.style				= UI_CENTER|UI_SMALLFONT;
    343 	s_rankings.spectate.color				= colorRed;
    344 	y += 20;
    345 
    346 	s_rankings.setup.generic.type		= MTYPE_PTEXT;
    347 	s_rankings.setup.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    348 	s_rankings.setup.generic.id			= ID_SETUP;
    349 	s_rankings.setup.generic.callback	= Rankings_MenuEvent;
    350 	s_rankings.setup.generic.x			= 320;
    351 	s_rankings.setup.generic.y			= y;
    352 	s_rankings.setup.string				= "SETUP";
    353 	s_rankings.setup.style				= UI_CENTER|UI_SMALLFONT;
    354 	s_rankings.setup.color				= colorRed;
    355 	y += 20;
    356 
    357 	s_rankings.leave.generic.type		= MTYPE_PTEXT;
    358 	s_rankings.leave.generic.flags		= QMF_CENTER_JUSTIFY|QMF_PULSEIFFOCUS;
    359 	s_rankings.leave.generic.id			= ID_LEAVE;
    360 	s_rankings.leave.generic.callback	= Rankings_MenuEvent;
    361 	s_rankings.leave.generic.x			= 320;
    362 	s_rankings.leave.generic.y			= y;
    363 	s_rankings.leave.string				= "LEAVE ARENA";
    364 	s_rankings.leave.style				= UI_CENTER|UI_SMALLFONT;
    365 	s_rankings.leave.color				= colorRed;
    366 	y += 20;
    367 
    368 	status = (grank_status_t)trap_Cvar_VariableValue("client_status");
    369 	if( (status != QGR_STATUS_NEW) && (status != QGR_STATUS_SPECTATOR) )
    370 	{
    371 		s_rankings.login.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;	
    372 		s_rankings.create.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
    373 		s_rankings.spectate.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
    374 
    375 		s_rankings.logout.generic.flags &= ~(QMF_HIDDEN | QMF_INACTIVE);
    376 	}
    377 	
    378 	if ( (status == QGR_STATUS_VALIDATING) ||
    379 		 (status == QGR_STATUS_PENDING) ||
    380 		 (status == QGR_STATUS_LEAVING) )
    381 	{
    382 		s_rankings.login.generic.flags  |= QMF_GRAYED;
    383 		s_rankings.create.generic.flags |= QMF_GRAYED;
    384 		s_rankings.logout.generic.flags |= QMF_GRAYED;
    385 	}
    386 	
    387 	//GRank FIXME -- don't need setup option any more
    388 	s_rankings.setup.generic.flags |= QMF_HIDDEN | QMF_INACTIVE;
    389 
    390 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.frame );
    391 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.login );
    392 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.logout );
    393 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.create );
    394 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.spectate );
    395 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.setup );
    396 	Menu_AddItem( &s_rankings.menu, (void*) &s_rankings.leave );
    397 }
    398 
    399 
    400 /*
    401 ===============
    402 Rankings_Cache
    403 ===============
    404 */
    405 void Rankings_Cache( void ) {
    406 	trap_R_RegisterShaderNoMip( RANKINGS_FRAME );
    407 }
    408 
    409 
    410 /*
    411 ===============
    412 UI_RankingsMenu
    413 ===============
    414 */
    415 void UI_RankingsMenu( void ) {
    416 	Rankings_MenuInit();
    417 	UI_PushMenu ( &s_rankings.menu );
    418 }
    419 
    420