Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

ui_preferences.c (15274B)


      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 =======================================================================
     25 
     26 GAME OPTIONS MENU
     27 
     28 =======================================================================
     29 */
     30 
     31 
     32 #include "ui_local.h"
     33 
     34 
     35 #define ART_FRAMEL				"menu/art/frame2_l"
     36 #define ART_FRAMER				"menu/art/frame1_r"
     37 #define ART_BACK0				"menu/art/back_0"
     38 #define ART_BACK1				"menu/art/back_1"
     39 
     40 #define PREFERENCES_X_POS		360
     41 
     42 #define ID_CROSSHAIR			127
     43 #define ID_SIMPLEITEMS			128
     44 #define ID_HIGHQUALITYSKY		129
     45 #define ID_EJECTINGBRASS		130
     46 #define ID_WALLMARKS			131
     47 #define ID_DYNAMICLIGHTS		132
     48 #define ID_IDENTIFYTARGET		133
     49 #define ID_SYNCEVERYFRAME		134
     50 #define ID_FORCEMODEL			135
     51 #define ID_DRAWTEAMOVERLAY		136
     52 #define ID_ALLOWDOWNLOAD			137
     53 #define ID_BACK					138
     54 
     55 #define	NUM_CROSSHAIRS			10
     56 
     57 
     58 typedef struct {
     59 	menuframework_s		menu;
     60 
     61 	menutext_s			banner;
     62 	menubitmap_s		framel;
     63 	menubitmap_s		framer;
     64 
     65 	menulist_s			crosshair;
     66 	menuradiobutton_s	simpleitems;
     67 	menuradiobutton_s	brass;
     68 	menuradiobutton_s	wallmarks;
     69 	menuradiobutton_s	dynamiclights;
     70 	menuradiobutton_s	identifytarget;
     71 	menuradiobutton_s	highqualitysky;
     72 	menuradiobutton_s	synceveryframe;
     73 	menuradiobutton_s	forcemodel;
     74 	menulist_s			drawteamoverlay;
     75 	menuradiobutton_s	allowdownload;
     76 	menubitmap_s		back;
     77 
     78 	qhandle_t			crosshairShader[NUM_CROSSHAIRS];
     79 } preferences_t;
     80 
     81 static preferences_t s_preferences;
     82 
     83 static const char *teamoverlay_names[] =
     84 {
     85 	"off",
     86 	"upper right",
     87 	"lower right",
     88 	"lower left",
     89 	0
     90 };
     91 
     92 static void Preferences_SetMenuItems( void ) {
     93 	s_preferences.crosshair.curvalue		= (int)trap_Cvar_VariableValue( "cg_drawCrosshair" ) % NUM_CROSSHAIRS;
     94 	s_preferences.simpleitems.curvalue		= trap_Cvar_VariableValue( "cg_simpleItems" ) != 0;
     95 	s_preferences.brass.curvalue			= trap_Cvar_VariableValue( "cg_brassTime" ) != 0;
     96 	s_preferences.wallmarks.curvalue		= trap_Cvar_VariableValue( "cg_marks" ) != 0;
     97 	s_preferences.identifytarget.curvalue	= trap_Cvar_VariableValue( "cg_drawCrosshairNames" ) != 0;
     98 	s_preferences.dynamiclights.curvalue	= trap_Cvar_VariableValue( "r_dynamiclight" ) != 0;
     99 	s_preferences.highqualitysky.curvalue	= trap_Cvar_VariableValue ( "r_fastsky" ) == 0;
    100 	s_preferences.synceveryframe.curvalue	= trap_Cvar_VariableValue( "r_finish" ) != 0;
    101 	s_preferences.forcemodel.curvalue		= trap_Cvar_VariableValue( "cg_forcemodel" ) != 0;
    102 	s_preferences.drawteamoverlay.curvalue	= Com_Clamp( 0, 3, trap_Cvar_VariableValue( "cg_drawTeamOverlay" ) );
    103 	s_preferences.allowdownload.curvalue	= trap_Cvar_VariableValue( "cl_allowDownload" ) != 0;
    104 }
    105 
    106 
    107 static void Preferences_Event( void* ptr, int notification ) {
    108 	if( notification != QM_ACTIVATED ) {
    109 		return;
    110 	}
    111 
    112 	switch( ((menucommon_s*)ptr)->id ) {
    113 	case ID_CROSSHAIR:
    114 		s_preferences.crosshair.curvalue++;
    115 		if( s_preferences.crosshair.curvalue == NUM_CROSSHAIRS ) {
    116 			s_preferences.crosshair.curvalue = 0;
    117 		}
    118 		trap_Cvar_SetValue( "cg_drawCrosshair", s_preferences.crosshair.curvalue );
    119 		break;
    120 
    121 	case ID_SIMPLEITEMS:
    122 		trap_Cvar_SetValue( "cg_simpleItems", s_preferences.simpleitems.curvalue );
    123 		break;
    124 
    125 	case ID_HIGHQUALITYSKY:
    126 		trap_Cvar_SetValue( "r_fastsky", !s_preferences.highqualitysky.curvalue );
    127 		break;
    128 
    129 	case ID_EJECTINGBRASS:
    130 		if ( s_preferences.brass.curvalue )
    131 			trap_Cvar_Reset( "cg_brassTime" );
    132 		else
    133 			trap_Cvar_SetValue( "cg_brassTime", 0 );
    134 		break;
    135 
    136 	case ID_WALLMARKS:
    137 		trap_Cvar_SetValue( "cg_marks", s_preferences.wallmarks.curvalue );
    138 		break;
    139 
    140 	case ID_DYNAMICLIGHTS:
    141 		trap_Cvar_SetValue( "r_dynamiclight", s_preferences.dynamiclights.curvalue );
    142 		break;		
    143 
    144 	case ID_IDENTIFYTARGET:
    145 		trap_Cvar_SetValue( "cg_drawCrosshairNames", s_preferences.identifytarget.curvalue );
    146 		break;
    147 
    148 	case ID_SYNCEVERYFRAME:
    149 		trap_Cvar_SetValue( "r_finish", s_preferences.synceveryframe.curvalue );
    150 		break;
    151 
    152 	case ID_FORCEMODEL:
    153 		trap_Cvar_SetValue( "cg_forcemodel", s_preferences.forcemodel.curvalue );
    154 		break;
    155 
    156 	case ID_DRAWTEAMOVERLAY:
    157 		trap_Cvar_SetValue( "cg_drawTeamOverlay", s_preferences.drawteamoverlay.curvalue );
    158 		break;
    159 
    160 	case ID_ALLOWDOWNLOAD:
    161 		trap_Cvar_SetValue( "cl_allowDownload", s_preferences.allowdownload.curvalue );
    162 		trap_Cvar_SetValue( "sv_allowDownload", s_preferences.allowdownload.curvalue );
    163 		break;
    164 
    165 	case ID_BACK:
    166 		UI_PopMenu();
    167 		break;
    168 	}
    169 }
    170 
    171 
    172 /*
    173 =================
    174 Crosshair_Draw
    175 =================
    176 */
    177 static void Crosshair_Draw( void *self ) {
    178 	menulist_s	*s;
    179 	float		*color;
    180 	int			x, y;
    181 	int			style;
    182 	qboolean	focus;
    183 
    184 	s = (menulist_s *)self;
    185 	x = s->generic.x;
    186 	y =	s->generic.y;
    187 
    188 	style = UI_SMALLFONT;
    189 	focus = (s->generic.parent->cursor == s->generic.menuPosition);
    190 
    191 	if ( s->generic.flags & QMF_GRAYED )
    192 		color = text_color_disabled;
    193 	else if ( focus )
    194 	{
    195 		color = text_color_highlight;
    196 		style |= UI_PULSE;
    197 	}
    198 	else if ( s->generic.flags & QMF_BLINK )
    199 	{
    200 		color = text_color_highlight;
    201 		style |= UI_BLINK;
    202 	}
    203 	else
    204 		color = text_color_normal;
    205 
    206 	if ( focus )
    207 	{
    208 		// draw cursor
    209 		UI_FillRect( s->generic.left, s->generic.top, s->generic.right-s->generic.left+1, s->generic.bottom-s->generic.top+1, listbar_color ); 
    210 		UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, color);
    211 	}
    212 
    213 	UI_DrawString( x - SMALLCHAR_WIDTH, y, s->generic.name, style|UI_RIGHT, color );
    214 	if( !s->curvalue ) {
    215 		return;
    216 	}
    217 	UI_DrawHandlePic( x + SMALLCHAR_WIDTH, y - 4, 24, 24, s_preferences.crosshairShader[s->curvalue] );
    218 }
    219 
    220 
    221 static void Preferences_MenuInit( void ) {
    222 	int				y;
    223 
    224 	memset( &s_preferences, 0 ,sizeof(preferences_t) );
    225 
    226 	Preferences_Cache();
    227 
    228 	s_preferences.menu.wrapAround = qtrue;
    229 	s_preferences.menu.fullscreen = qtrue;
    230 
    231 	s_preferences.banner.generic.type  = MTYPE_BTEXT;
    232 	s_preferences.banner.generic.x	   = 320;
    233 	s_preferences.banner.generic.y	   = 16;
    234 	s_preferences.banner.string		   = "GAME OPTIONS";
    235 	s_preferences.banner.color         = color_white;
    236 	s_preferences.banner.style         = UI_CENTER;
    237 
    238 	s_preferences.framel.generic.type  = MTYPE_BITMAP;
    239 	s_preferences.framel.generic.name  = ART_FRAMEL;
    240 	s_preferences.framel.generic.flags = QMF_INACTIVE;
    241 	s_preferences.framel.generic.x	   = 0;
    242 	s_preferences.framel.generic.y	   = 78;
    243 	s_preferences.framel.width  	   = 256;
    244 	s_preferences.framel.height  	   = 329;
    245 
    246 	s_preferences.framer.generic.type  = MTYPE_BITMAP;
    247 	s_preferences.framer.generic.name  = ART_FRAMER;
    248 	s_preferences.framer.generic.flags = QMF_INACTIVE;
    249 	s_preferences.framer.generic.x	   = 376;
    250 	s_preferences.framer.generic.y	   = 76;
    251 	s_preferences.framer.width  	   = 256;
    252 	s_preferences.framer.height  	   = 334;
    253 
    254 	y = 144;
    255 	s_preferences.crosshair.generic.type		= MTYPE_TEXT;
    256 	s_preferences.crosshair.generic.flags		= QMF_PULSEIFFOCUS|QMF_SMALLFONT|QMF_NODEFAULTINIT|QMF_OWNERDRAW;
    257 	s_preferences.crosshair.generic.x			= PREFERENCES_X_POS;
    258 	s_preferences.crosshair.generic.y			= y;
    259 	s_preferences.crosshair.generic.name		= "Crosshair:";
    260 	s_preferences.crosshair.generic.callback	= Preferences_Event;
    261 	s_preferences.crosshair.generic.ownerdraw	= Crosshair_Draw;
    262 	s_preferences.crosshair.generic.id			= ID_CROSSHAIR;
    263 	s_preferences.crosshair.generic.top			= y - 4;
    264 	s_preferences.crosshair.generic.bottom		= y + 20;
    265 	s_preferences.crosshair.generic.left		= PREFERENCES_X_POS - ( ( strlen(s_preferences.crosshair.generic.name) + 1 ) * SMALLCHAR_WIDTH );
    266 	s_preferences.crosshair.generic.right		= PREFERENCES_X_POS + 48;
    267 
    268 	y += BIGCHAR_HEIGHT+2+4;
    269 	s_preferences.simpleitems.generic.type        = MTYPE_RADIOBUTTON;
    270 	s_preferences.simpleitems.generic.name	      = "Simple Items:";
    271 	s_preferences.simpleitems.generic.flags	      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    272 	s_preferences.simpleitems.generic.callback    = Preferences_Event;
    273 	s_preferences.simpleitems.generic.id          = ID_SIMPLEITEMS;
    274 	s_preferences.simpleitems.generic.x	          = PREFERENCES_X_POS;
    275 	s_preferences.simpleitems.generic.y	          = y;
    276 
    277 	y += BIGCHAR_HEIGHT;
    278 	s_preferences.wallmarks.generic.type          = MTYPE_RADIOBUTTON;
    279 	s_preferences.wallmarks.generic.name	      = "Marks on Walls:";
    280 	s_preferences.wallmarks.generic.flags	      = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    281 	s_preferences.wallmarks.generic.callback      = Preferences_Event;
    282 	s_preferences.wallmarks.generic.id            = ID_WALLMARKS;
    283 	s_preferences.wallmarks.generic.x	          = PREFERENCES_X_POS;
    284 	s_preferences.wallmarks.generic.y	          = y;
    285 
    286 	y += BIGCHAR_HEIGHT+2;
    287 	s_preferences.brass.generic.type              = MTYPE_RADIOBUTTON;
    288 	s_preferences.brass.generic.name	          = "Ejecting Brass:";
    289 	s_preferences.brass.generic.flags	          = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    290 	s_preferences.brass.generic.callback          = Preferences_Event;
    291 	s_preferences.brass.generic.id                = ID_EJECTINGBRASS;
    292 	s_preferences.brass.generic.x	              = PREFERENCES_X_POS;
    293 	s_preferences.brass.generic.y	              = y;
    294 
    295 	y += BIGCHAR_HEIGHT+2;
    296 	s_preferences.dynamiclights.generic.type      = MTYPE_RADIOBUTTON;
    297 	s_preferences.dynamiclights.generic.name	  = "Dynamic Lights:";
    298 	s_preferences.dynamiclights.generic.flags     = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    299 	s_preferences.dynamiclights.generic.callback  = Preferences_Event;
    300 	s_preferences.dynamiclights.generic.id        = ID_DYNAMICLIGHTS;
    301 	s_preferences.dynamiclights.generic.x	      = PREFERENCES_X_POS;
    302 	s_preferences.dynamiclights.generic.y	      = y;
    303 
    304 	y += BIGCHAR_HEIGHT+2;
    305 	s_preferences.identifytarget.generic.type     = MTYPE_RADIOBUTTON;
    306 	s_preferences.identifytarget.generic.name	  = "Identify Target:";
    307 	s_preferences.identifytarget.generic.flags    = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    308 	s_preferences.identifytarget.generic.callback = Preferences_Event;
    309 	s_preferences.identifytarget.generic.id       = ID_IDENTIFYTARGET;
    310 	s_preferences.identifytarget.generic.x	      = PREFERENCES_X_POS;
    311 	s_preferences.identifytarget.generic.y	      = y;
    312 
    313 	y += BIGCHAR_HEIGHT+2;
    314 	s_preferences.highqualitysky.generic.type     = MTYPE_RADIOBUTTON;
    315 	s_preferences.highqualitysky.generic.name	  = "High Quality Sky:";
    316 	s_preferences.highqualitysky.generic.flags	  = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    317 	s_preferences.highqualitysky.generic.callback = Preferences_Event;
    318 	s_preferences.highqualitysky.generic.id       = ID_HIGHQUALITYSKY;
    319 	s_preferences.highqualitysky.generic.x	      = PREFERENCES_X_POS;
    320 	s_preferences.highqualitysky.generic.y	      = y;
    321 
    322 	y += BIGCHAR_HEIGHT+2;
    323 	s_preferences.synceveryframe.generic.type     = MTYPE_RADIOBUTTON;
    324 	s_preferences.synceveryframe.generic.name	  = "Sync Every Frame:";
    325 	s_preferences.synceveryframe.generic.flags	  = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    326 	s_preferences.synceveryframe.generic.callback = Preferences_Event;
    327 	s_preferences.synceveryframe.generic.id       = ID_SYNCEVERYFRAME;
    328 	s_preferences.synceveryframe.generic.x	      = PREFERENCES_X_POS;
    329 	s_preferences.synceveryframe.generic.y	      = y;
    330 
    331 	y += BIGCHAR_HEIGHT+2;
    332 	s_preferences.forcemodel.generic.type     = MTYPE_RADIOBUTTON;
    333 	s_preferences.forcemodel.generic.name	  = "Force Player Models:";
    334 	s_preferences.forcemodel.generic.flags	  = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    335 	s_preferences.forcemodel.generic.callback = Preferences_Event;
    336 	s_preferences.forcemodel.generic.id       = ID_FORCEMODEL;
    337 	s_preferences.forcemodel.generic.x	      = PREFERENCES_X_POS;
    338 	s_preferences.forcemodel.generic.y	      = y;
    339 
    340 	y += BIGCHAR_HEIGHT+2;
    341 	s_preferences.drawteamoverlay.generic.type     = MTYPE_SPINCONTROL;
    342 	s_preferences.drawteamoverlay.generic.name	   = "Draw Team Overlay:";
    343 	s_preferences.drawteamoverlay.generic.flags	   = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    344 	s_preferences.drawteamoverlay.generic.callback = Preferences_Event;
    345 	s_preferences.drawteamoverlay.generic.id       = ID_DRAWTEAMOVERLAY;
    346 	s_preferences.drawteamoverlay.generic.x	       = PREFERENCES_X_POS;
    347 	s_preferences.drawteamoverlay.generic.y	       = y;
    348 	s_preferences.drawteamoverlay.itemnames			= teamoverlay_names;
    349 
    350 	y += BIGCHAR_HEIGHT+2;
    351 	s_preferences.allowdownload.generic.type     = MTYPE_RADIOBUTTON;
    352 	s_preferences.allowdownload.generic.name	   = "Automatic Downloading:";
    353 	s_preferences.allowdownload.generic.flags	   = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
    354 	s_preferences.allowdownload.generic.callback = Preferences_Event;
    355 	s_preferences.allowdownload.generic.id       = ID_ALLOWDOWNLOAD;
    356 	s_preferences.allowdownload.generic.x	       = PREFERENCES_X_POS;
    357 	s_preferences.allowdownload.generic.y	       = y;
    358 
    359 	y += BIGCHAR_HEIGHT+2;
    360 	s_preferences.back.generic.type	    = MTYPE_BITMAP;
    361 	s_preferences.back.generic.name     = ART_BACK0;
    362 	s_preferences.back.generic.flags    = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
    363 	s_preferences.back.generic.callback = Preferences_Event;
    364 	s_preferences.back.generic.id	    = ID_BACK;
    365 	s_preferences.back.generic.x		= 0;
    366 	s_preferences.back.generic.y		= 480-64;
    367 	s_preferences.back.width  		    = 128;
    368 	s_preferences.back.height  		    = 64;
    369 	s_preferences.back.focuspic         = ART_BACK1;
    370 
    371 	Menu_AddItem( &s_preferences.menu, &s_preferences.banner );
    372 	Menu_AddItem( &s_preferences.menu, &s_preferences.framel );
    373 	Menu_AddItem( &s_preferences.menu, &s_preferences.framer );
    374 
    375 	Menu_AddItem( &s_preferences.menu, &s_preferences.crosshair );
    376 	Menu_AddItem( &s_preferences.menu, &s_preferences.simpleitems );
    377 	Menu_AddItem( &s_preferences.menu, &s_preferences.wallmarks );
    378 	Menu_AddItem( &s_preferences.menu, &s_preferences.brass );
    379 	Menu_AddItem( &s_preferences.menu, &s_preferences.dynamiclights );
    380 	Menu_AddItem( &s_preferences.menu, &s_preferences.identifytarget );
    381 	Menu_AddItem( &s_preferences.menu, &s_preferences.highqualitysky );
    382 	Menu_AddItem( &s_preferences.menu, &s_preferences.synceveryframe );
    383 	Menu_AddItem( &s_preferences.menu, &s_preferences.forcemodel );
    384 	Menu_AddItem( &s_preferences.menu, &s_preferences.drawteamoverlay );
    385 	Menu_AddItem( &s_preferences.menu, &s_preferences.allowdownload );
    386 
    387 	Menu_AddItem( &s_preferences.menu, &s_preferences.back );
    388 
    389 	Preferences_SetMenuItems();
    390 }
    391 
    392 
    393 /*
    394 ===============
    395 Preferences_Cache
    396 ===============
    397 */
    398 void Preferences_Cache( void ) {
    399 	int		n;
    400 
    401 	trap_R_RegisterShaderNoMip( ART_FRAMEL );
    402 	trap_R_RegisterShaderNoMip( ART_FRAMER );
    403 	trap_R_RegisterShaderNoMip( ART_BACK0 );
    404 	trap_R_RegisterShaderNoMip( ART_BACK1 );
    405 	for( n = 0; n < NUM_CROSSHAIRS; n++ ) {
    406 		s_preferences.crosshairShader[n] = trap_R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) );
    407 	}
    408 }
    409 
    410 
    411 /*
    412 ===============
    413 UI_PreferencesMenu
    414 ===============
    415 */
    416 void UI_PreferencesMenu( void ) {
    417 	Preferences_MenuInit();
    418 	UI_PushMenu( &s_preferences.menu );
    419 }