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 }