00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
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
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
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
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
00257
00258
00259 static void PlayerSettings_SaveChanges( void ) {
00260
00261 trap_Cvar_Set( "name", s_playersettings.name.field.buffer );
00262
00263
00264 trap_Cvar_SetValue( "handicap", 100 - s_playersettings.handicap.curvalue * 5 );
00265
00266
00267 trap_Cvar_SetValue( "color1", uitogamecode[s_playersettings.effects.curvalue] );
00268 }
00269
00270
00271
00272
00273
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
00287
00288
00289 static void PlayerSettings_SetMenuItems( void ) {
00290 vec3_t viewangles;
00291 int c;
00292 int h;
00293
00294
00295 Q_strncpyz( s_playersettings.name.field.buffer, UI_Cvar_VariableString("name"), sizeof(s_playersettings.name.field.buffer) );
00296
00297
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
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
00315 h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") );
00316 s_playersettings.handicap.curvalue = 20 - h / 5;
00317 }
00318
00319
00320
00321
00322
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
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
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
00508
00509
00510 void UI_PlayerSettingsMenu( void ) {
00511 PlayerSettings_MenuInit();
00512 UI_PushMenu( &s_playersettings.menu );
00513 }