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

ui_playersettings.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 #include "ui_local.h"
00024 
00025 #define ART_FRAMEL          "menu/art/frame2_l"
00026 #define ART_FRAMER          "menu/art/frame1_r"
00027 #define ART_MODEL0          "menu/art/model_0"
00028 #define ART_MODEL1          "menu/art/model_1"
00029 #define ART_BACK0           "menu/art/back_0"
00030 #define ART_BACK1           "menu/art/back_1"
00031 #define ART_FX_BASE         "menu/art/fx_base"
00032 #define ART_FX_BLUE         "menu/art/fx_blue"
00033 #define ART_FX_CYAN         "menu/art/fx_cyan"
00034 #define ART_FX_GREEN        "menu/art/fx_grn"
00035 #define ART_FX_RED          "menu/art/fx_red"
00036 #define ART_FX_TEAL         "menu/art/fx_teal"
00037 #define ART_FX_WHITE        "menu/art/fx_white"
00038 #define ART_FX_YELLOW       "menu/art/fx_yel"
00039 
00040 #define ID_NAME         10
00041 #define ID_HANDICAP     11
00042 #define ID_EFFECTS      12
00043 #define ID_BACK         13
00044 #define ID_MODEL        14
00045 
00046 #define MAX_NAMELENGTH  20
00047 
00048 
00049 typedef struct {
00050     menuframework_s     menu;
00051 
00052     menutext_s          banner;
00053     menubitmap_s        framel;
00054     menubitmap_s        framer;
00055     menubitmap_s        player;
00056 
00057     menufield_s         name;
00058     menulist_s          handicap;
00059     menulist_s          effects;
00060 
00061     menubitmap_s        back;
00062     menubitmap_s        model;
00063     menubitmap_s        item_null;
00064 
00065     qhandle_t           fxBasePic;
00066     qhandle_t           fxPic[7];
00067     playerInfo_t        playerinfo;
00068     int                 current_fx;
00069     char                playerModel[MAX_QPATH];
00070 } playersettings_t;
00071 
00072 static playersettings_t s_playersettings;
00073 
00074 static int gamecodetoui[] = {4,2,3,0,5,1,6};
00075 static int uitogamecode[] = {4,6,2,3,1,5,7};
00076 
00077 static const char *handicap_items[] = {
00078     "None",
00079     "95",
00080     "90",
00081     "85",
00082     "80",
00083     "75",
00084     "70",
00085     "65",
00086     "60",
00087     "55",
00088     "50",
00089     "45",
00090     "40",
00091     "35",
00092     "30",
00093     "25",
00094     "20",
00095     "15",
00096     "10",
00097     "5",
00098     0
00099 };
00100 
00101 
00102 /*
00103 =================
00104 PlayerSettings_DrawName
00105 =================
00106 */
00107 static void PlayerSettings_DrawName( void *self ) {
00108     menufield_s     *f;
00109     qboolean        focus;
00110     int             style;
00111     char            *txt;
00112     char            c;
00113     float           *color;
00114     int             n;
00115     int             basex, x, y;
00116     char            name[32];
00117 
00118     f = (menufield_s*)self;
00119     basex = f->generic.x;
00120     y = f->generic.y;
00121     focus = (f->generic.parent->cursor == f->generic.menuPosition);
00122 
00123     style = UI_LEFT|UI_SMALLFONT;
00124     color = text_color_normal;
00125     if( focus ) {
00126         style |= UI_PULSE;
00127         color = text_color_highlight;
00128     }
00129 
00130     UI_DrawProportionalString( basex, y, "Name", style, color );
00131 
00132     // draw the actual name
00133     basex += 64;
00134     y += PROP_HEIGHT;
00135     txt = f->field.buffer;
00136     color = g_color_table[ColorIndex(COLOR_WHITE)];
00137     x = basex;
00138     while ( (c = *txt) != 0 ) {
00139         if ( !focus && Q_IsColorString( txt ) ) {
00140             n = ColorIndex( *(txt+1) );
00141             if( n == 0 ) {
00142                 n = 7;
00143             }
00144             color = g_color_table[n];
00145             txt += 2;
00146             continue;
00147         }
00148         UI_DrawChar( x, y, c, style, color );
00149         txt++;
00150         x += SMALLCHAR_WIDTH;
00151     }
00152 
00153     // draw cursor if we have focus
00154     if( focus ) {
00155         if ( trap_Key_GetOverstrikeMode() ) {
00156             c = 11;
00157         } else {
00158             c = 10;
00159         }
00160 
00161         style &= ~UI_PULSE;
00162         style |= UI_BLINK;
00163 
00164         UI_DrawChar( basex + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white );
00165     }
00166 
00167     // draw at bottom also using proportional font
00168     Q_strncpyz( name, f->field.buffer, sizeof(name) );
00169     Q_CleanStr( name );
00170     UI_DrawProportionalString( 320, 440, name, UI_CENTER|UI_BIGFONT, text_color_normal );
00171 }
00172 
00173 
00174 /*
00175 =================
00176 PlayerSettings_DrawHandicap
00177 =================
00178 */
00179 static void PlayerSettings_DrawHandicap( void *self ) {
00180     menulist_s      *item;
00181     qboolean        focus;
00182     int             style;
00183     float           *color;
00184 
00185     item = (menulist_s *)self;
00186     focus = (item->generic.parent->cursor == item->generic.menuPosition);
00187 
00188     style = UI_LEFT|UI_SMALLFONT;
00189     color = text_color_normal;
00190     if( focus ) {
00191         style |= UI_PULSE;
00192         color = text_color_highlight;
00193     }
00194 
00195     UI_DrawProportionalString( item->generic.x, item->generic.y, "Handicap", style, color );
00196     UI_DrawProportionalString( item->generic.x + 64, item->generic.y + PROP_HEIGHT, handicap_items[item->curvalue], style, color );
00197 }
00198 
00199 
00200 /*
00201 =================
00202 PlayerSettings_DrawEffects
00203 =================
00204 */
00205 static void PlayerSettings_DrawEffects( void *self ) {
00206     menulist_s      *item;
00207     qboolean        focus;
00208     int             style;
00209     float           *color;
00210 
00211     item = (menulist_s *)self;
00212     focus = (item->generic.parent->cursor == item->generic.menuPosition);
00213 
00214     style = UI_LEFT|UI_SMALLFONT;
00215     color = text_color_normal;
00216     if( focus ) {
00217         style |= UI_PULSE;
00218         color = text_color_highlight;
00219     }
00220 
00221     UI_DrawProportionalString( item->generic.x, item->generic.y, "Effects", style, color );
00222 
00223     UI_DrawHandlePic( item->generic.x + 64, item->generic.y + PROP_HEIGHT + 8, 128, 8, s_playersettings.fxBasePic );
00224     UI_DrawHandlePic( item->generic.x + 64 + item->curvalue * 16 + 8, item->generic.y + PROP_HEIGHT + 6, 16, 12, s_playersettings.fxPic[item->curvalue] );
00225 }
00226 
00227 
00228 /*
00229 =================
00230 PlayerSettings_DrawPlayer
00231 =================
00232 */
00233 static void PlayerSettings_DrawPlayer( void *self ) {
00234     menubitmap_s    *b;
00235     vec3_t          viewangles;
00236     char            buf[MAX_QPATH];
00237 
00238     trap_Cvar_VariableStringBuffer( "model", buf, sizeof( buf ) );
00239     if ( strcmp( buf, s_playersettings.playerModel ) != 0 ) {
00240         UI_PlayerInfo_SetModel( &s_playersettings.playerinfo, buf );
00241         strcpy( s_playersettings.playerModel, buf );
00242 
00243         viewangles[YAW]   = 180 - 30;
00244         viewangles[PITCH] = 0;
00245         viewangles[ROLL]  = 0;
00246         UI_PlayerInfo_SetInfo( &s_playersettings.playerinfo, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse );
00247     }
00248 
00249     b = (menubitmap_s*) self;
00250     UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_playersettings.playerinfo, uis.realtime/2 );
00251 }
00252 
00253 
00254 /*
00255 =================
00256 PlayerSettings_SaveChanges
00257 =================
00258 */
00259 static void PlayerSettings_SaveChanges( void ) {
00260     // name
00261     trap_Cvar_Set( "name", s_playersettings.name.field.buffer );
00262 
00263     // handicap
00264     trap_Cvar_SetValue( "handicap", 100 - s_playersettings.handicap.curvalue * 5 );
00265 
00266     // effects color
00267     trap_Cvar_SetValue( "color1", uitogamecode[s_playersettings.effects.curvalue] );
00268 }
00269 
00270 
00271 /*
00272 =================
00273 PlayerSettings_MenuKey
00274 =================
00275 */
00276 static sfxHandle_t PlayerSettings_MenuKey( int key ) {
00277     if( key == K_MOUSE2 || key == K_ESCAPE ) {
00278         PlayerSettings_SaveChanges();
00279     }
00280     return Menu_DefaultKey( &s_playersettings.menu, key );
00281 }
00282 
00283 
00284 /*
00285 =================
00286 PlayerSettings_SetMenuItems
00287 =================
00288 */
00289 static void PlayerSettings_SetMenuItems( void ) {
00290     vec3_t  viewangles;
00291     int     c;
00292     int     h;
00293 
00294     // name
00295     Q_strncpyz( s_playersettings.name.field.buffer, UI_Cvar_VariableString("name"), sizeof(s_playersettings.name.field.buffer) );
00296 
00297     // effects color
00298     c = trap_Cvar_VariableValue( "color1" ) - 1;
00299     if( c < 0 || c > 6 ) {
00300         c = 6;
00301     }
00302     s_playersettings.effects.curvalue = gamecodetoui[c];
00303 
00304     // model/skin
00305     memset( &s_playersettings.playerinfo, 0, sizeof(playerInfo_t) );
00306     
00307     viewangles[YAW]   = 180 - 30;
00308     viewangles[PITCH] = 0;
00309     viewangles[ROLL]  = 0;
00310 
00311     UI_PlayerInfo_SetModel( &s_playersettings.playerinfo, UI_Cvar_VariableString( "model" ) );
00312     UI_PlayerInfo_SetInfo( &s_playersettings.playerinfo, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse );
00313 
00314     // handicap
00315     h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") );
00316     s_playersettings.handicap.curvalue = 20 - h / 5;
00317 }
00318 
00319 
00320 /*
00321 =================
00322 PlayerSettings_MenuEvent
00323 =================
00324 */
00325 static void PlayerSettings_MenuEvent( void* ptr, int event ) {
00326     if( event != QM_ACTIVATED ) {
00327         return;
00328     }
00329 
00330     switch( ((menucommon_s*)ptr)->id ) {
00331     case ID_HANDICAP:
00332         trap_Cvar_Set( "handicap", va( "%i", 100 - 25 * s_playersettings.handicap.curvalue ) );
00333         break;
00334 
00335     case ID_MODEL:
00336         PlayerSettings_SaveChanges();
00337         UI_PlayerModelMenu();
00338         break;
00339 
00340     case ID_BACK:
00341         PlayerSettings_SaveChanges();
00342         UI_PopMenu();
00343         break;
00344     }
00345 }
00346 
00347 
00348 /*
00349 =================
00350 PlayerSettings_MenuInit
00351 =================
00352 */
00353 static void PlayerSettings_MenuInit( void ) {
00354     int     y;
00355 
00356     memset(&s_playersettings,0,sizeof(playersettings_t));
00357 
00358     PlayerSettings_Cache();
00359 
00360     s_playersettings.menu.key        = PlayerSettings_MenuKey;
00361     s_playersettings.menu.wrapAround = qtrue;
00362     s_playersettings.menu.fullscreen = qtrue;
00363 
00364     s_playersettings.banner.generic.type  = MTYPE_BTEXT;
00365     s_playersettings.banner.generic.x     = 320;
00366     s_playersettings.banner.generic.y     = 16;
00367     s_playersettings.banner.string        = "PLAYER SETTINGS";
00368     s_playersettings.banner.color         = color_white;
00369     s_playersettings.banner.style         = UI_CENTER;
00370 
00371     s_playersettings.framel.generic.type  = MTYPE_BITMAP;
00372     s_playersettings.framel.generic.name  = ART_FRAMEL;
00373     s_playersettings.framel.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00374     s_playersettings.framel.generic.x     = 0;
00375     s_playersettings.framel.generic.y     = 78;
00376     s_playersettings.framel.width         = 256;
00377     s_playersettings.framel.height        = 329;
00378 
00379     s_playersettings.framer.generic.type  = MTYPE_BITMAP;
00380     s_playersettings.framer.generic.name  = ART_FRAMER;
00381     s_playersettings.framer.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
00382     s_playersettings.framer.generic.x     = 376;
00383     s_playersettings.framer.generic.y     = 76;
00384     s_playersettings.framer.width         = 256;
00385     s_playersettings.framer.height        = 334;
00386 
00387     y = 144;
00388     s_playersettings.name.generic.type          = MTYPE_FIELD;
00389     s_playersettings.name.generic.flags         = QMF_NODEFAULTINIT;
00390     s_playersettings.name.generic.ownerdraw     = PlayerSettings_DrawName;
00391     s_playersettings.name.field.widthInChars    = MAX_NAMELENGTH;
00392     s_playersettings.name.field.maxchars        = MAX_NAMELENGTH;
00393     s_playersettings.name.generic.x             = 192;
00394     s_playersettings.name.generic.y             = y;
00395     s_playersettings.name.generic.left          = 192 - 8;
00396     s_playersettings.name.generic.top           = y - 8;
00397     s_playersettings.name.generic.right         = 192 + 200;
00398     s_playersettings.name.generic.bottom        = y + 2 * PROP_HEIGHT;
00399 
00400     y += 3 * PROP_HEIGHT;
00401     s_playersettings.handicap.generic.type      = MTYPE_SPINCONTROL;
00402     s_playersettings.handicap.generic.flags     = QMF_NODEFAULTINIT;
00403     s_playersettings.handicap.generic.id        = ID_HANDICAP;
00404     s_playersettings.handicap.generic.ownerdraw = PlayerSettings_DrawHandicap;
00405     s_playersettings.handicap.generic.x         = 192;
00406     s_playersettings.handicap.generic.y         = y;
00407     s_playersettings.handicap.generic.left      = 192 - 8;
00408     s_playersettings.handicap.generic.top       = y - 8;
00409     s_playersettings.handicap.generic.right     = 192 + 200;
00410     s_playersettings.handicap.generic.bottom    = y + 2 * PROP_HEIGHT;
00411     s_playersettings.handicap.numitems          = 20;
00412 
00413     y += 3 * PROP_HEIGHT;
00414     s_playersettings.effects.generic.type       = MTYPE_SPINCONTROL;
00415     s_playersettings.effects.generic.flags      = QMF_NODEFAULTINIT;
00416     s_playersettings.effects.generic.id         = ID_EFFECTS;
00417     s_playersettings.effects.generic.ownerdraw  = PlayerSettings_DrawEffects;
00418     s_playersettings.effects.generic.x          = 192;
00419     s_playersettings.effects.generic.y          = y;
00420     s_playersettings.effects.generic.left       = 192 - 8;
00421     s_playersettings.effects.generic.top        = y - 8;
00422     s_playersettings.effects.generic.right      = 192 + 200;
00423     s_playersettings.effects.generic.bottom     = y + 2* PROP_HEIGHT;
00424     s_playersettings.effects.numitems           = 7;
00425 
00426     s_playersettings.model.generic.type         = MTYPE_BITMAP;
00427     s_playersettings.model.generic.name         = ART_MODEL0;
00428     s_playersettings.model.generic.flags        = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
00429     s_playersettings.model.generic.id           = ID_MODEL;
00430     s_playersettings.model.generic.callback     = PlayerSettings_MenuEvent;
00431     s_playersettings.model.generic.x            = 640;
00432     s_playersettings.model.generic.y            = 480-64;
00433     s_playersettings.model.width                = 128;
00434     s_playersettings.model.height               = 64;
00435     s_playersettings.model.focuspic             = ART_MODEL1;
00436 
00437     s_playersettings.player.generic.type        = MTYPE_BITMAP;
00438     s_playersettings.player.generic.flags       = QMF_INACTIVE;
00439     s_playersettings.player.generic.ownerdraw   = PlayerSettings_DrawPlayer;
00440     s_playersettings.player.generic.x           = 400;
00441     s_playersettings.player.generic.y           = -40;
00442     s_playersettings.player.width               = 32*10;
00443     s_playersettings.player.height              = 56*10;
00444 
00445     s_playersettings.back.generic.type          = MTYPE_BITMAP;
00446     s_playersettings.back.generic.name          = ART_BACK0;
00447     s_playersettings.back.generic.flags         = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
00448     s_playersettings.back.generic.id            = ID_BACK;
00449     s_playersettings.back.generic.callback      = PlayerSettings_MenuEvent;
00450     s_playersettings.back.generic.x             = 0;
00451     s_playersettings.back.generic.y             = 480-64;
00452     s_playersettings.back.width                 = 128;
00453     s_playersettings.back.height                = 64;
00454     s_playersettings.back.focuspic              = ART_BACK1;
00455 
00456     s_playersettings.item_null.generic.type     = MTYPE_BITMAP;
00457     s_playersettings.item_null.generic.flags    = QMF_LEFT_JUSTIFY|QMF_MOUSEONLY|QMF_SILENT;
00458     s_playersettings.item_null.generic.x        = 0;
00459     s_playersettings.item_null.generic.y        = 0;
00460     s_playersettings.item_null.width            = 640;
00461     s_playersettings.item_null.height           = 480;
00462 
00463     Menu_AddItem( &s_playersettings.menu, &s_playersettings.banner );
00464     Menu_AddItem( &s_playersettings.menu, &s_playersettings.framel );
00465     Menu_AddItem( &s_playersettings.menu, &s_playersettings.framer );
00466 
00467     Menu_AddItem( &s_playersettings.menu, &s_playersettings.name );
00468     Menu_AddItem( &s_playersettings.menu, &s_playersettings.handicap );
00469     Menu_AddItem( &s_playersettings.menu, &s_playersettings.effects );
00470     Menu_AddItem( &s_playersettings.menu, &s_playersettings.model );
00471     Menu_AddItem( &s_playersettings.menu, &s_playersettings.back );
00472 
00473     Menu_AddItem( &s_playersettings.menu, &s_playersettings.player );
00474 
00475     Menu_AddItem( &s_playersettings.menu, &s_playersettings.item_null );
00476 
00477     PlayerSettings_SetMenuItems();
00478 }
00479 
00480 
00481 /*
00482 =================
00483 PlayerSettings_Cache
00484 =================
00485 */
00486 void PlayerSettings_Cache( void ) {
00487     trap_R_RegisterShaderNoMip( ART_FRAMEL );
00488     trap_R_RegisterShaderNoMip( ART_FRAMER );
00489     trap_R_RegisterShaderNoMip( ART_MODEL0 );
00490     trap_R_RegisterShaderNoMip( ART_MODEL1 );
00491     trap_R_RegisterShaderNoMip( ART_BACK0 );
00492     trap_R_RegisterShaderNoMip( ART_BACK1 );
00493 
00494     s_playersettings.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE );
00495     s_playersettings.fxPic[0] = trap_R_RegisterShaderNoMip( ART_FX_RED );
00496     s_playersettings.fxPic[1] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW );
00497     s_playersettings.fxPic[2] = trap_R_RegisterShaderNoMip( ART_FX_GREEN );
00498     s_playersettings.fxPic[3] = trap_R_RegisterShaderNoMip( ART_FX_TEAL );
00499     s_playersettings.fxPic[4] = trap_R_RegisterShaderNoMip( ART_FX_BLUE );
00500     s_playersettings.fxPic[5] = trap_R_RegisterShaderNoMip( ART_FX_CYAN );
00501     s_playersettings.fxPic[6] = trap_R_RegisterShaderNoMip( ART_FX_WHITE );
00502 }
00503 
00504 
00505 /*
00506 =================
00507 UI_PlayerSettingsMenu
00508 =================
00509 */
00510 void UI_PlayerSettingsMenu( void ) {
00511     PlayerSettings_MenuInit();
00512     UI_PushMenu( &s_playersettings.menu );
00513 }

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