Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

ui_preferences.c

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 ===========================================================================
00021 */
00022 //
00023 /*
00024 =======================================================================
00025 
00026 GAME OPTIONS MENU
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 Crosshair_Draw
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         // draw cursor
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 Preferences_Cache
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 UI_PreferencesMenu
00414 ===============
00415 */
00416 void UI_PreferencesMenu( void ) {
00417     Preferences_MenuInit();
00418     UI_PushMenu( &s_preferences.menu );
00419 }

Generated on Thu Aug 25 12:37:43 2005 for Quake III Arena by  doxygen 1.3.9.1