00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "ui_local.h"
00033
00034
00035 #define ART_FRAMEL "menu/art/frame2_l"
00036 #define ART_FRAMER "menu/art/frame1_r"
00037 #define ART_BACK0 "menu/art/back_0"
00038 #define ART_BACK1 "menu/art/back_1"
00039
00040 #define PREFERENCES_X_POS 360
00041
00042 #define ID_CROSSHAIR 127
00043 #define ID_SIMPLEITEMS 128
00044 #define ID_HIGHQUALITYSKY 129
00045 #define ID_EJECTINGBRASS 130
00046 #define ID_WALLMARKS 131
00047 #define ID_DYNAMICLIGHTS 132
00048 #define ID_IDENTIFYTARGET 133
00049 #define ID_SYNCEVERYFRAME 134
00050 #define ID_FORCEMODEL 135
00051 #define ID_DRAWTEAMOVERLAY 136
00052 #define ID_ALLOWDOWNLOAD 137
00053 #define ID_BACK 138
00054
00055 #define NUM_CROSSHAIRS 10
00056
00057
00058 typedef struct {
00059 menuframework_s menu;
00060
00061 menutext_s banner;
00062 menubitmap_s framel;
00063 menubitmap_s framer;
00064
00065 menulist_s crosshair;
00066 menuradiobutton_s simpleitems;
00067 menuradiobutton_s brass;
00068 menuradiobutton_s wallmarks;
00069 menuradiobutton_s dynamiclights;
00070 menuradiobutton_s identifytarget;
00071 menuradiobutton_s highqualitysky;
00072 menuradiobutton_s synceveryframe;
00073 menuradiobutton_s forcemodel;
00074 menulist_s drawteamoverlay;
00075 menuradiobutton_s allowdownload;
00076 menubitmap_s back;
00077
00078 qhandle_t crosshairShader[NUM_CROSSHAIRS];
00079 } preferences_t;
00080
00081 static preferences_t s_preferences;
00082
00083 static const char *teamoverlay_names[] =
00084 {
00085 "off",
00086 "upper right",
00087 "lower right",
00088 "lower left",
00089 0
00090 };
00091
00092 static void Preferences_SetMenuItems( void ) {
00093 s_preferences.crosshair.curvalue = (int)trap_Cvar_VariableValue( "cg_drawCrosshair" ) % NUM_CROSSHAIRS;
00094 s_preferences.simpleitems.curvalue = trap_Cvar_VariableValue( "cg_simpleItems" ) != 0;
00095 s_preferences.brass.curvalue = trap_Cvar_VariableValue( "cg_brassTime" ) != 0;
00096 s_preferences.wallmarks.curvalue = trap_Cvar_VariableValue( "cg_marks" ) != 0;
00097 s_preferences.identifytarget.curvalue = trap_Cvar_VariableValue( "cg_drawCrosshairNames" ) != 0;
00098 s_preferences.dynamiclights.curvalue = trap_Cvar_VariableValue( "r_dynamiclight" ) != 0;
00099 s_preferences.highqualitysky.curvalue = trap_Cvar_VariableValue ( "r_fastsky" ) == 0;
00100 s_preferences.synceveryframe.curvalue = trap_Cvar_VariableValue( "r_finish" ) != 0;
00101 s_preferences.forcemodel.curvalue = trap_Cvar_VariableValue( "cg_forcemodel" ) != 0;
00102 s_preferences.drawteamoverlay.curvalue = Com_Clamp( 0, 3, trap_Cvar_VariableValue( "cg_drawTeamOverlay" ) );
00103 s_preferences.allowdownload.curvalue = trap_Cvar_VariableValue( "cl_allowDownload" ) != 0;
00104 }
00105
00106
00107 static void Preferences_Event( void* ptr, int notification ) {
00108 if( notification != QM_ACTIVATED ) {
00109 return;
00110 }
00111
00112 switch( ((menucommon_s*)ptr)->id ) {
00113 case ID_CROSSHAIR:
00114 s_preferences.crosshair.curvalue++;
00115 if( s_preferences.crosshair.curvalue == NUM_CROSSHAIRS ) {
00116 s_preferences.crosshair.curvalue = 0;
00117 }
00118 trap_Cvar_SetValue( "cg_drawCrosshair", s_preferences.crosshair.curvalue );
00119 break;
00120
00121 case ID_SIMPLEITEMS:
00122 trap_Cvar_SetValue( "cg_simpleItems", s_preferences.simpleitems.curvalue );
00123 break;
00124
00125 case ID_HIGHQUALITYSKY:
00126 trap_Cvar_SetValue( "r_fastsky", !s_preferences.highqualitysky.curvalue );
00127 break;
00128
00129 case ID_EJECTINGBRASS:
00130 if ( s_preferences.brass.curvalue )
00131 trap_Cvar_Reset( "cg_brassTime" );
00132 else
00133 trap_Cvar_SetValue( "cg_brassTime", 0 );
00134 break;
00135
00136 case ID_WALLMARKS:
00137 trap_Cvar_SetValue( "cg_marks", s_preferences.wallmarks.curvalue );
00138 break;
00139
00140 case ID_DYNAMICLIGHTS:
00141 trap_Cvar_SetValue( "r_dynamiclight", s_preferences.dynamiclights.curvalue );
00142 break;
00143
00144 case ID_IDENTIFYTARGET:
00145 trap_Cvar_SetValue( "cg_drawCrosshairNames", s_preferences.identifytarget.curvalue );
00146 break;
00147
00148 case ID_SYNCEVERYFRAME:
00149 trap_Cvar_SetValue( "r_finish", s_preferences.synceveryframe.curvalue );
00150 break;
00151
00152 case ID_FORCEMODEL:
00153 trap_Cvar_SetValue( "cg_forcemodel", s_preferences.forcemodel.curvalue );
00154 break;
00155
00156 case ID_DRAWTEAMOVERLAY:
00157 trap_Cvar_SetValue( "cg_drawTeamOverlay", s_preferences.drawteamoverlay.curvalue );
00158 break;
00159
00160 case ID_ALLOWDOWNLOAD:
00161 trap_Cvar_SetValue( "cl_allowDownload", s_preferences.allowdownload.curvalue );
00162 trap_Cvar_SetValue( "sv_allowDownload", s_preferences.allowdownload.curvalue );
00163 break;
00164
00165 case ID_BACK:
00166 UI_PopMenu();
00167 break;
00168 }
00169 }
00170
00171
00172
00173
00174
00175
00176
00177 static void Crosshair_Draw( void *self ) {
00178 menulist_s *s;
00179 float *color;
00180 int x, y;
00181 int style;
00182 qboolean focus;
00183
00184 s = (menulist_s *)self;
00185 x = s->generic.x;
00186 y = s->generic.y;
00187
00188 style = UI_SMALLFONT;
00189 focus = (s->generic.parent->cursor == s->generic.menuPosition);
00190
00191 if ( s->generic.flags & QMF_GRAYED )
00192 color = text_color_disabled;
00193 else if ( focus )
00194 {
00195 color = text_color_highlight;
00196 style |= UI_PULSE;
00197 }
00198 else if ( s->generic.flags & QMF_BLINK )
00199 {
00200 color = text_color_highlight;
00201 style |= UI_BLINK;
00202 }
00203 else
00204 color = text_color_normal;
00205
00206 if ( focus )
00207 {
00208
00209 UI_FillRect( s->generic.left, s->generic.top, s->generic.right-s->generic.left+1, s->generic.bottom-s->generic.top+1, listbar_color );
00210 UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, color);
00211 }
00212
00213 UI_DrawString( x - SMALLCHAR_WIDTH, y, s->generic.name, style|UI_RIGHT, color );
00214 if( !s->curvalue ) {
00215 return;
00216 }
00217 UI_DrawHandlePic( x + SMALLCHAR_WIDTH, y - 4, 24, 24, s_preferences.crosshairShader[s->curvalue] );
00218 }
00219
00220
00221 static void Preferences_MenuInit( void ) {
00222 int y;
00223
00224 memset( &s_preferences, 0 ,sizeof(preferences_t) );
00225
00226 Preferences_Cache();
00227
00228 s_preferences.menu.wrapAround = qtrue;
00229 s_preferences.menu.fullscreen = qtrue;
00230
00231 s_preferences.banner.generic.type = MTYPE_BTEXT;
00232 s_preferences.banner.generic.x = 320;
00233 s_preferences.banner.generic.y = 16;
00234 s_preferences.banner.string = "GAME OPTIONS";
00235 s_preferences.banner.color = color_white;
00236 s_preferences.banner.style = UI_CENTER;
00237
00238 s_preferences.framel.generic.type = MTYPE_BITMAP;
00239 s_preferences.framel.generic.name = ART_FRAMEL;
00240 s_preferences.framel.generic.flags = QMF_INACTIVE;
00241 s_preferences.framel.generic.x = 0;
00242 s_preferences.framel.generic.y = 78;
00243 s_preferences.framel.width = 256;
00244 s_preferences.framel.height = 329;
00245
00246 s_preferences.framer.generic.type = MTYPE_BITMAP;
00247 s_preferences.framer.generic.name = ART_FRAMER;
00248 s_preferences.framer.generic.flags = QMF_INACTIVE;
00249 s_preferences.framer.generic.x = 376;
00250 s_preferences.framer.generic.y = 76;
00251 s_preferences.framer.width = 256;
00252 s_preferences.framer.height = 334;
00253
00254 y = 144;
00255 s_preferences.crosshair.generic.type = MTYPE_TEXT;
00256 s_preferences.crosshair.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT|QMF_NODEFAULTINIT|QMF_OWNERDRAW;
00257 s_preferences.crosshair.generic.x = PREFERENCES_X_POS;
00258 s_preferences.crosshair.generic.y = y;
00259 s_preferences.crosshair.generic.name = "Crosshair:";
00260 s_preferences.crosshair.generic.callback = Preferences_Event;
00261 s_preferences.crosshair.generic.ownerdraw = Crosshair_Draw;
00262 s_preferences.crosshair.generic.id = ID_CROSSHAIR;
00263 s_preferences.crosshair.generic.top = y - 4;
00264 s_preferences.crosshair.generic.bottom = y + 20;
00265 s_preferences.crosshair.generic.left = PREFERENCES_X_POS - ( ( strlen(s_preferences.crosshair.generic.name) + 1 ) * SMALLCHAR_WIDTH );
00266 s_preferences.crosshair.generic.right = PREFERENCES_X_POS + 48;
00267
00268 y += BIGCHAR_HEIGHT+2+4;
00269 s_preferences.simpleitems.generic.type = MTYPE_RADIOBUTTON;
00270 s_preferences.simpleitems.generic.name = "Simple Items:";
00271 s_preferences.simpleitems.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00272 s_preferences.simpleitems.generic.callback = Preferences_Event;
00273 s_preferences.simpleitems.generic.id = ID_SIMPLEITEMS;
00274 s_preferences.simpleitems.generic.x = PREFERENCES_X_POS;
00275 s_preferences.simpleitems.generic.y = y;
00276
00277 y += BIGCHAR_HEIGHT;
00278 s_preferences.wallmarks.generic.type = MTYPE_RADIOBUTTON;
00279 s_preferences.wallmarks.generic.name = "Marks on Walls:";
00280 s_preferences.wallmarks.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00281 s_preferences.wallmarks.generic.callback = Preferences_Event;
00282 s_preferences.wallmarks.generic.id = ID_WALLMARKS;
00283 s_preferences.wallmarks.generic.x = PREFERENCES_X_POS;
00284 s_preferences.wallmarks.generic.y = y;
00285
00286 y += BIGCHAR_HEIGHT+2;
00287 s_preferences.brass.generic.type = MTYPE_RADIOBUTTON;
00288 s_preferences.brass.generic.name = "Ejecting Brass:";
00289 s_preferences.brass.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00290 s_preferences.brass.generic.callback = Preferences_Event;
00291 s_preferences.brass.generic.id = ID_EJECTINGBRASS;
00292 s_preferences.brass.generic.x = PREFERENCES_X_POS;
00293 s_preferences.brass.generic.y = y;
00294
00295 y += BIGCHAR_HEIGHT+2;
00296 s_preferences.dynamiclights.generic.type = MTYPE_RADIOBUTTON;
00297 s_preferences.dynamiclights.generic.name = "Dynamic Lights:";
00298 s_preferences.dynamiclights.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00299 s_preferences.dynamiclights.generic.callback = Preferences_Event;
00300 s_preferences.dynamiclights.generic.id = ID_DYNAMICLIGHTS;
00301 s_preferences.dynamiclights.generic.x = PREFERENCES_X_POS;
00302 s_preferences.dynamiclights.generic.y = y;
00303
00304 y += BIGCHAR_HEIGHT+2;
00305 s_preferences.identifytarget.generic.type = MTYPE_RADIOBUTTON;
00306 s_preferences.identifytarget.generic.name = "Identify Target:";
00307 s_preferences.identifytarget.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00308 s_preferences.identifytarget.generic.callback = Preferences_Event;
00309 s_preferences.identifytarget.generic.id = ID_IDENTIFYTARGET;
00310 s_preferences.identifytarget.generic.x = PREFERENCES_X_POS;
00311 s_preferences.identifytarget.generic.y = y;
00312
00313 y += BIGCHAR_HEIGHT+2;
00314 s_preferences.highqualitysky.generic.type = MTYPE_RADIOBUTTON;
00315 s_preferences.highqualitysky.generic.name = "High Quality Sky:";
00316 s_preferences.highqualitysky.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00317 s_preferences.highqualitysky.generic.callback = Preferences_Event;
00318 s_preferences.highqualitysky.generic.id = ID_HIGHQUALITYSKY;
00319 s_preferences.highqualitysky.generic.x = PREFERENCES_X_POS;
00320 s_preferences.highqualitysky.generic.y = y;
00321
00322 y += BIGCHAR_HEIGHT+2;
00323 s_preferences.synceveryframe.generic.type = MTYPE_RADIOBUTTON;
00324 s_preferences.synceveryframe.generic.name = "Sync Every Frame:";
00325 s_preferences.synceveryframe.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00326 s_preferences.synceveryframe.generic.callback = Preferences_Event;
00327 s_preferences.synceveryframe.generic.id = ID_SYNCEVERYFRAME;
00328 s_preferences.synceveryframe.generic.x = PREFERENCES_X_POS;
00329 s_preferences.synceveryframe.generic.y = y;
00330
00331 y += BIGCHAR_HEIGHT+2;
00332 s_preferences.forcemodel.generic.type = MTYPE_RADIOBUTTON;
00333 s_preferences.forcemodel.generic.name = "Force Player Models:";
00334 s_preferences.forcemodel.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00335 s_preferences.forcemodel.generic.callback = Preferences_Event;
00336 s_preferences.forcemodel.generic.id = ID_FORCEMODEL;
00337 s_preferences.forcemodel.generic.x = PREFERENCES_X_POS;
00338 s_preferences.forcemodel.generic.y = y;
00339
00340 y += BIGCHAR_HEIGHT+2;
00341 s_preferences.drawteamoverlay.generic.type = MTYPE_SPINCONTROL;
00342 s_preferences.drawteamoverlay.generic.name = "Draw Team Overlay:";
00343 s_preferences.drawteamoverlay.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00344 s_preferences.drawteamoverlay.generic.callback = Preferences_Event;
00345 s_preferences.drawteamoverlay.generic.id = ID_DRAWTEAMOVERLAY;
00346 s_preferences.drawteamoverlay.generic.x = PREFERENCES_X_POS;
00347 s_preferences.drawteamoverlay.generic.y = y;
00348 s_preferences.drawteamoverlay.itemnames = teamoverlay_names;
00349
00350 y += BIGCHAR_HEIGHT+2;
00351 s_preferences.allowdownload.generic.type = MTYPE_RADIOBUTTON;
00352 s_preferences.allowdownload.generic.name = "Automatic Downloading:";
00353 s_preferences.allowdownload.generic.flags = QMF_PULSEIFFOCUS|QMF_SMALLFONT;
00354 s_preferences.allowdownload.generic.callback = Preferences_Event;
00355 s_preferences.allowdownload.generic.id = ID_ALLOWDOWNLOAD;
00356 s_preferences.allowdownload.generic.x = PREFERENCES_X_POS;
00357 s_preferences.allowdownload.generic.y = y;
00358
00359 y += BIGCHAR_HEIGHT+2;
00360 s_preferences.back.generic.type = MTYPE_BITMAP;
00361 s_preferences.back.generic.name = ART_BACK0;
00362 s_preferences.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00363 s_preferences.back.generic.callback = Preferences_Event;
00364 s_preferences.back.generic.id = ID_BACK;
00365 s_preferences.back.generic.x = 0;
00366 s_preferences.back.generic.y = 480-64;
00367 s_preferences.back.width = 128;
00368 s_preferences.back.height = 64;
00369 s_preferences.back.focuspic = ART_BACK1;
00370
00371 Menu_AddItem( &s_preferences.menu, &s_preferences.banner );
00372 Menu_AddItem( &s_preferences.menu, &s_preferences.framel );
00373 Menu_AddItem( &s_preferences.menu, &s_preferences.framer );
00374
00375 Menu_AddItem( &s_preferences.menu, &s_preferences.crosshair );
00376 Menu_AddItem( &s_preferences.menu, &s_preferences.simpleitems );
00377 Menu_AddItem( &s_preferences.menu, &s_preferences.wallmarks );
00378 Menu_AddItem( &s_preferences.menu, &s_preferences.brass );
00379 Menu_AddItem( &s_preferences.menu, &s_preferences.dynamiclights );
00380 Menu_AddItem( &s_preferences.menu, &s_preferences.identifytarget );
00381 Menu_AddItem( &s_preferences.menu, &s_preferences.highqualitysky );
00382 Menu_AddItem( &s_preferences.menu, &s_preferences.synceveryframe );
00383 Menu_AddItem( &s_preferences.menu, &s_preferences.forcemodel );
00384 Menu_AddItem( &s_preferences.menu, &s_preferences.drawteamoverlay );
00385 Menu_AddItem( &s_preferences.menu, &s_preferences.allowdownload );
00386
00387 Menu_AddItem( &s_preferences.menu, &s_preferences.back );
00388
00389 Preferences_SetMenuItems();
00390 }
00391
00392
00393
00394
00395
00396
00397
00398 void Preferences_Cache( void ) {
00399 int n;
00400
00401 trap_R_RegisterShaderNoMip( ART_FRAMEL );
00402 trap_R_RegisterShaderNoMip( ART_FRAMER );
00403 trap_R_RegisterShaderNoMip( ART_BACK0 );
00404 trap_R_RegisterShaderNoMip( ART_BACK1 );
00405 for( n = 0; n < NUM_CROSSHAIRS; n++ ) {
00406 s_preferences.crosshairShader[n] = trap_R_RegisterShaderNoMip( va("gfx/2d/crosshair%c", 'a' + n ) );
00407 }
00408 }
00409
00410
00411
00412
00413
00414
00415
00416 void UI_PreferencesMenu( void ) {
00417 Preferences_MenuInit();
00418 UI_PushMenu( &s_preferences.menu );
00419 }