2
===========================================================================
3
Copyright (C) 1999-2005 Id Software, Inc.
5
This file is part of Quake III Arena source code.
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.
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.
17
You should have received a copy of the GNU General Public License
18
along with Quake III Arena source code; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
===========================================================================
24
=======================================================================
28
=======================================================================
34
#define ART_BACK0 "menu/art/back_0"
35
#define ART_BACK1 "menu/art/back_1"
36
#define ART_FRAMEL "menu/art/frame2_l"
37
#define ART_FRAMER "menu/art/frame1_r"
70
#define ID_MOVEMENT 100
71
#define ID_LOOKING 101
72
#define ID_WEAPONS 102
74
#define ID_DEFAULTS 104
76
#define ID_SAVEANDEXIT 106
80
#define ID_SHOWSCORES 0
84
#define ID_BACKPEDAL 4
86
#define ID_MOVERIGHT 6
93
#define ID_LOOKDOWN 13
94
#define ID_MOUSELOOK 14
95
#define ID_CENTERVIEW 15
96
#define ID_ZOOMVIEW 16
100
#define ID_WEAPON4 20
101
#define ID_WEAPON5 21
102
#define ID_WEAPON6 22
103
#define ID_WEAPON7 23
104
#define ID_WEAPON8 24
105
#define ID_WEAPON9 25
107
#define ID_WEAPPREV 27
108
#define ID_WEAPNEXT 28
109
#define ID_GESTURE 29
116
#define ID_FREELOOK 34
117
#define ID_INVERTMOUSE 35
118
#define ID_ALWAYSRUN 36
119
#define ID_AUTOSWITCH 37
120
#define ID_MOUSESPEED 38
121
#define ID_JOYENABLE 39
122
#define ID_JOYTHRESHOLD 40
123
#define ID_SMOOTHMOUSE 41
130
#define ANIM_CROUCH 5
131
#define ANIM_STEPLEFT 6
132
#define ANIM_STEPRIGHT 7
133
#define ANIM_TURNLEFT 8
134
#define ANIM_TURNRIGHT 9
135
#define ANIM_LOOKUP 10
136
#define ANIM_LOOKDOWN 11
137
#define ANIM_WEAPON1 12
138
#define ANIM_WEAPON2 13
139
#define ANIM_WEAPON3 14
140
#define ANIM_WEAPON4 15
141
#define ANIM_WEAPON5 16
142
#define ANIM_WEAPON6 17
143
#define ANIM_WEAPON7 18
144
#define ANIM_WEAPON8 19
145
#define ANIM_WEAPON9 20
146
#define ANIM_WEAPON10 21
147
#define ANIM_ATTACK 22
148
#define ANIM_GESTURE 23
154
menuframework_s menu;
166
menuaction_s walkforward;
167
menuaction_s backpedal;
168
menuaction_s stepleft;
169
menuaction_s stepright;
171
menuaction_s movedown;
172
menuaction_s turnleft;
173
menuaction_s turnright;
174
menuaction_s sidestep;
176
menuaction_s machinegun;
177
menuaction_s chainsaw;
178
menuaction_s shotgun;
179
menuaction_s grenadelauncher;
180
menuaction_s rocketlauncher;
181
menuaction_s lightning;
182
menuaction_s railgun;
186
menuaction_s prevweapon;
187
menuaction_s nextweapon;
189
menuaction_s lookdown;
190
menuaction_s mouselook;
191
menuradiobutton_s freelook;
192
menuaction_s centerview;
193
menuaction_s zoomview;
194
menuaction_s gesture;
195
menuradiobutton_s invertmouse;
196
menuslider_s sensitivity;
197
menuradiobutton_s smoothmouse;
198
menuradiobutton_s alwaysrun;
199
menuaction_s showscores;
200
menuradiobutton_s autoswitch;
201
menuaction_s useitem;
202
playerInfo_t playerinfo;
203
qboolean changesmade;
208
menuradiobutton_s joyenable;
209
menuslider_s joythreshold;
211
qboolean waitingforkey;
212
char playerModel[64];
213
vec3_t playerViewangles;
214
vec3_t playerMoveangles;
224
static controls_t s_controls;
226
static vec4_t controls_binding_color = {1.00f, 0.43f, 0.00f, 1.00f}; // bk: Win32 C4305
228
static bind_t g_bindings[] =
230
{"+scores", "show scores", ID_SHOWSCORES, ANIM_IDLE, K_TAB, -1, -1, -1},
231
{"+button2", "use item", ID_USEITEM, ANIM_IDLE, K_ENTER, -1, -1, -1},
232
{"+speed", "run / walk", ID_SPEED, ANIM_RUN, K_SHIFT, -1, -1, -1},
233
{"+forward", "walk forward", ID_FORWARD, ANIM_WALK, K_UPARROW, -1, -1, -1},
234
{"+back", "backpedal", ID_BACKPEDAL, ANIM_BACK, K_DOWNARROW, -1, -1, -1},
235
{"+moveleft", "step left", ID_MOVELEFT, ANIM_STEPLEFT, ',', -1, -1, -1},
236
{"+moveright", "step right", ID_MOVERIGHT, ANIM_STEPRIGHT, '.', -1, -1, -1},
237
{"+moveup", "up / jump", ID_MOVEUP, ANIM_JUMP, K_SPACE, -1, -1, -1},
238
{"+movedown", "down / crouch", ID_MOVEDOWN, ANIM_CROUCH, 'c', -1, -1, -1},
239
{"+left", "turn left", ID_LEFT, ANIM_TURNLEFT, K_LEFTARROW, -1, -1, -1},
240
{"+right", "turn right", ID_RIGHT, ANIM_TURNRIGHT, K_RIGHTARROW, -1, -1, -1},
241
{"+strafe", "sidestep / turn", ID_STRAFE, ANIM_IDLE, K_ALT, -1, -1, -1},
242
{"+lookup", "look up", ID_LOOKUP, ANIM_LOOKUP, K_PGDN, -1, -1, -1},
243
{"+lookdown", "look down", ID_LOOKDOWN, ANIM_LOOKDOWN, K_DEL, -1, -1, -1},
244
{"+mlook", "mouse look", ID_MOUSELOOK, ANIM_IDLE, '/', -1, -1, -1},
245
{"centerview", "center view", ID_CENTERVIEW, ANIM_IDLE, K_END, -1, -1, -1},
246
{"+zoom", "zoom view", ID_ZOOMVIEW, ANIM_IDLE, -1, -1, -1, -1},
247
{"weapon 1", "gauntlet", ID_WEAPON1, ANIM_WEAPON1, '1', -1, -1, -1},
248
{"weapon 2", "machinegun", ID_WEAPON2, ANIM_WEAPON2, '2', -1, -1, -1},
249
{"weapon 3", "shotgun", ID_WEAPON3, ANIM_WEAPON3, '3', -1, -1, -1},
250
{"weapon 4", "grenade launcher", ID_WEAPON4, ANIM_WEAPON4, '4', -1, -1, -1},
251
{"weapon 5", "rocket launcher", ID_WEAPON5, ANIM_WEAPON5, '5', -1, -1, -1},
252
{"weapon 6", "lightning", ID_WEAPON6, ANIM_WEAPON6, '6', -1, -1, -1},
253
{"weapon 7", "railgun", ID_WEAPON7, ANIM_WEAPON7, '7', -1, -1, -1},
254
{"weapon 8", "plasma gun", ID_WEAPON8, ANIM_WEAPON8, '8', -1, -1, -1},
255
{"weapon 9", "BFG", ID_WEAPON9, ANIM_WEAPON9, '9', -1, -1, -1},
256
{"+attack", "attack", ID_ATTACK, ANIM_ATTACK, K_CTRL, -1, -1, -1},
257
{"weapprev", "prev weapon", ID_WEAPPREV, ANIM_IDLE, '[', -1, -1, -1},
258
{"weapnext", "next weapon", ID_WEAPNEXT, ANIM_IDLE, ']', -1, -1, -1},
259
{"+button3", "gesture", ID_GESTURE, ANIM_GESTURE, K_MOUSE3, -1, -1, -1},
260
{"messagemode", "chat", ID_CHAT, ANIM_CHAT, 't', -1, -1, -1},
261
{"messagemode2", "chat - team", ID_CHAT2, ANIM_CHAT, -1, -1, -1, -1},
262
{"messagemode3", "chat - target", ID_CHAT3, ANIM_CHAT, -1, -1, -1, -1},
263
{"messagemode4", "chat - attacker", ID_CHAT4, ANIM_CHAT, -1, -1, -1, -1},
264
{(char*)NULL, (char*)NULL, 0, 0, -1, -1, -1, -1},
267
static configcvar_t g_configcvars[] =
271
{"cg_autoswitch", 0, 0},
272
{"sensitivity", 0, 0},
273
{"in_joystick", 0, 0},
274
{"joy_threshold", 0, 0},
276
{"cl_freelook", 0, 0},
280
static menucommon_s *g_movement_controls[] =
282
(menucommon_s *)&s_controls.alwaysrun,
283
(menucommon_s *)&s_controls.run,
284
(menucommon_s *)&s_controls.walkforward,
285
(menucommon_s *)&s_controls.backpedal,
286
(menucommon_s *)&s_controls.stepleft,
287
(menucommon_s *)&s_controls.stepright,
288
(menucommon_s *)&s_controls.moveup,
289
(menucommon_s *)&s_controls.movedown,
290
(menucommon_s *)&s_controls.turnleft,
291
(menucommon_s *)&s_controls.turnright,
292
(menucommon_s *)&s_controls.sidestep,
296
static menucommon_s *g_weapons_controls[] = {
297
(menucommon_s *)&s_controls.attack,
298
(menucommon_s *)&s_controls.nextweapon,
299
(menucommon_s *)&s_controls.prevweapon,
300
(menucommon_s *)&s_controls.autoswitch,
301
(menucommon_s *)&s_controls.chainsaw,
302
(menucommon_s *)&s_controls.machinegun,
303
(menucommon_s *)&s_controls.shotgun,
304
(menucommon_s *)&s_controls.grenadelauncher,
305
(menucommon_s *)&s_controls.rocketlauncher,
306
(menucommon_s *)&s_controls.lightning,
307
(menucommon_s *)&s_controls.railgun,
308
(menucommon_s *)&s_controls.plasma,
309
(menucommon_s *)&s_controls.bfg,
313
static menucommon_s *g_looking_controls[] = {
314
(menucommon_s *)&s_controls.sensitivity,
315
(menucommon_s *)&s_controls.smoothmouse,
316
(menucommon_s *)&s_controls.invertmouse,
317
(menucommon_s *)&s_controls.lookup,
318
(menucommon_s *)&s_controls.lookdown,
319
(menucommon_s *)&s_controls.mouselook,
320
(menucommon_s *)&s_controls.freelook,
321
(menucommon_s *)&s_controls.centerview,
322
(menucommon_s *)&s_controls.zoomview,
323
(menucommon_s *)&s_controls.joyenable,
324
(menucommon_s *)&s_controls.joythreshold,
328
static menucommon_s *g_misc_controls[] = {
329
(menucommon_s *)&s_controls.showscores,
330
(menucommon_s *)&s_controls.useitem,
331
(menucommon_s *)&s_controls.gesture,
332
(menucommon_s *)&s_controls.chat,
333
(menucommon_s *)&s_controls.chat2,
334
(menucommon_s *)&s_controls.chat3,
335
(menucommon_s *)&s_controls.chat4,
339
static menucommon_s **g_controls[] = {
351
static void Controls_InitCvars( void )
354
configcvar_t* cvarptr;
356
cvarptr = g_configcvars;
357
for (i=0; ;i++,cvarptr++)
363
cvarptr->value = trap_Cvar_VariableValue( cvarptr->name );
366
trap_Cvar_Reset( cvarptr->name );
367
cvarptr->defaultvalue = trap_Cvar_VariableValue( cvarptr->name );
369
// restore current value
370
trap_Cvar_SetValue( cvarptr->name, cvarptr->value );
376
Controls_GetCvarDefault
379
static float Controls_GetCvarDefault( char* name )
381
configcvar_t* cvarptr;
384
cvarptr = g_configcvars;
385
for (i=0; ;i++,cvarptr++)
390
if (!strcmp(cvarptr->name,name))
394
return (cvarptr->defaultvalue);
399
Controls_GetCvarValue
402
static float Controls_GetCvarValue( char* name )
404
configcvar_t* cvarptr;
407
cvarptr = g_configcvars;
408
for (i=0; ;i++,cvarptr++)
413
if (!strcmp(cvarptr->name,name))
417
return (cvarptr->value);
426
static void Controls_UpdateModel( int anim ) {
427
VectorClear( s_controls.playerViewangles );
428
VectorClear( s_controls.playerMoveangles );
429
s_controls.playerViewangles[YAW] = 180 - 30;
430
s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW];
431
s_controls.playerLegs = LEGS_IDLE;
432
s_controls.playerTorso = TORSO_STAND;
433
s_controls.playerWeapon = -1;
434
s_controls.playerChat = qfalse;
438
s_controls.playerLegs = LEGS_RUN;
442
s_controls.playerLegs = LEGS_WALK;
446
s_controls.playerLegs = LEGS_BACK;
450
s_controls.playerLegs = LEGS_JUMP;
454
s_controls.playerLegs = LEGS_IDLECR;
458
s_controls.playerViewangles[YAW] += 90;
462
s_controls.playerViewangles[YAW] -= 90;
466
s_controls.playerLegs = LEGS_WALK;
467
s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW] + 90;
471
s_controls.playerLegs = LEGS_WALK;
472
s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW] - 90;
476
s_controls.playerViewangles[PITCH] = -45;
480
s_controls.playerViewangles[PITCH] = 45;
484
s_controls.playerWeapon = WP_GAUNTLET;
488
s_controls.playerWeapon = WP_MACHINEGUN;
492
s_controls.playerWeapon = WP_SHOTGUN;
496
s_controls.playerWeapon = WP_GRENADE_LAUNCHER;
500
s_controls.playerWeapon = WP_ROCKET_LAUNCHER;
504
s_controls.playerWeapon = WP_LIGHTNING;
508
s_controls.playerWeapon = WP_RAILGUN;
512
s_controls.playerWeapon = WP_PLASMAGUN;
516
s_controls.playerWeapon = WP_BFG;
520
s_controls.playerWeapon = WP_GRAPPLING_HOOK;
524
s_controls.playerTorso = TORSO_ATTACK;
528
s_controls.playerTorso = TORSO_GESTURE;
532
s_controls.playerLegs = BOTH_DEATH1;
533
s_controls.playerTorso = BOTH_DEATH1;
534
s_controls.playerWeapon = WP_NONE;
538
s_controls.playerChat = qtrue;
545
UI_PlayerInfo_SetInfo( &s_controls.playerinfo, s_controls.playerLegs, s_controls.playerTorso, s_controls.playerViewangles, s_controls.playerMoveangles, s_controls.playerWeapon, s_controls.playerChat );
554
static void Controls_Update( void ) {
558
menucommon_s **controls;
559
menucommon_s *control;
561
// disable all controls in all groups
562
for( i = 0; i < C_MAX; i++ ) {
563
controls = g_controls[i];
564
// bk001204 - parentheses
565
for( j = 0; (control = controls[j]) ; j++ ) {
566
control->flags |= (QMF_HIDDEN|QMF_INACTIVE);
570
controls = g_controls[s_controls.section];
572
// enable controls in active group (and count number of items for vertical centering)
573
// bk001204 - parentheses
574
for( j = 0; (control = controls[j]) ; j++ ) {
575
control->flags &= ~(QMF_GRAYED|QMF_HIDDEN|QMF_INACTIVE);
579
y = ( SCREEN_HEIGHT - j * SMALLCHAR_HEIGHT ) / 2;
580
// bk001204 - parentheses
581
for( j = 0; (control = controls[j]) ; j++, y += SMALLCHAR_HEIGHT ) {
584
control->left = 320 - 19*SMALLCHAR_WIDTH;
585
control->right = 320 + 21*SMALLCHAR_WIDTH;
587
control->bottom = y + SMALLCHAR_HEIGHT;
590
if( s_controls.waitingforkey ) {
592
for( i = 0; i < s_controls.menu.nitems; i++ ) {
593
((menucommon_s*)(s_controls.menu.items[i]))->flags |= QMF_GRAYED;
596
// enable action item
597
((menucommon_s*)(s_controls.menu.items[s_controls.menu.cursor]))->flags &= ~QMF_GRAYED;
599
// don't gray out player's name
600
s_controls.name.generic.flags &= ~QMF_GRAYED;
606
for( i = 0; i < s_controls.menu.nitems; i++ ) {
607
((menucommon_s*)(s_controls.menu.items[i]))->flags &= ~QMF_GRAYED;
610
// makes sure flags are right on the group selection controls
611
s_controls.looking.generic.flags &= ~(QMF_GRAYED|QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
612
s_controls.movement.generic.flags &= ~(QMF_GRAYED|QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
613
s_controls.weapons.generic.flags &= ~(QMF_GRAYED|QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
614
s_controls.misc.generic.flags &= ~(QMF_GRAYED|QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
616
s_controls.looking.generic.flags |= QMF_PULSEIFFOCUS;
617
s_controls.movement.generic.flags |= QMF_PULSEIFFOCUS;
618
s_controls.weapons.generic.flags |= QMF_PULSEIFFOCUS;
619
s_controls.misc.generic.flags |= QMF_PULSEIFFOCUS;
622
switch( s_controls.section ) {
624
s_controls.movement.generic.flags &= ~QMF_PULSEIFFOCUS;
625
s_controls.movement.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
629
s_controls.looking.generic.flags &= ~QMF_PULSEIFFOCUS;
630
s_controls.looking.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
634
s_controls.weapons.generic.flags &= ~QMF_PULSEIFFOCUS;
635
s_controls.weapons.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
639
s_controls.misc.generic.flags &= ~QMF_PULSEIFFOCUS;
640
s_controls.misc.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
648
Controls_DrawKeyBinding
651
static void Controls_DrawKeyBinding( void *self )
662
a = (menuaction_s*) self;
667
c = (Menu_ItemAtCursor( a->generic.parent ) == a);
669
b1 = g_bindings[a->generic.id].bind1;
674
trap_Key_KeynumToStringBuf( b1, name, 32 );
677
b2 = g_bindings[a->generic.id].bind2;
680
trap_Key_KeynumToStringBuf( b2, name2, 32 );
683
strcat( name, " or " );
684
strcat( name, name2 );
690
UI_FillRect( a->generic.left, a->generic.top, a->generic.right-a->generic.left+1, a->generic.bottom-a->generic.top+1, listbar_color );
692
UI_DrawString( x - SMALLCHAR_WIDTH, y, g_bindings[a->generic.id].label, UI_RIGHT|UI_SMALLFONT, text_color_highlight );
693
UI_DrawString( x + SMALLCHAR_WIDTH, y, name, UI_LEFT|UI_SMALLFONT|UI_PULSE, text_color_highlight );
695
if (s_controls.waitingforkey)
697
UI_DrawChar( x, y, '=', UI_CENTER|UI_BLINK|UI_SMALLFONT, text_color_highlight);
698
UI_DrawString(SCREEN_WIDTH * 0.50, SCREEN_HEIGHT * 0.80, "Waiting for new key ... ESCAPE to cancel", UI_SMALLFONT|UI_CENTER|UI_PULSE, colorWhite );
702
UI_DrawChar( x, y, 13, UI_CENTER|UI_BLINK|UI_SMALLFONT, text_color_highlight);
703
UI_DrawString(SCREEN_WIDTH * 0.50, SCREEN_HEIGHT * 0.78, "Press ENTER or CLICK to change", UI_SMALLFONT|UI_CENTER, colorWhite );
704
UI_DrawString(SCREEN_WIDTH * 0.50, SCREEN_HEIGHT * 0.82, "Press BACKSPACE to clear", UI_SMALLFONT|UI_CENTER, colorWhite );
709
if (a->generic.flags & QMF_GRAYED)
711
UI_DrawString( x - SMALLCHAR_WIDTH, y, g_bindings[a->generic.id].label, UI_RIGHT|UI_SMALLFONT, text_color_disabled );
712
UI_DrawString( x + SMALLCHAR_WIDTH, y, name, UI_LEFT|UI_SMALLFONT, text_color_disabled );
716
UI_DrawString( x - SMALLCHAR_WIDTH, y, g_bindings[a->generic.id].label, UI_RIGHT|UI_SMALLFONT, controls_binding_color );
717
UI_DrawString( x + SMALLCHAR_WIDTH, y, name, UI_LEFT|UI_SMALLFONT, controls_binding_color );
727
static void Controls_StatusBar( void *self )
729
UI_DrawString(SCREEN_WIDTH * 0.50, SCREEN_HEIGHT * 0.80, "Use Arrow Keys or CLICK to change", UI_SMALLFONT|UI_CENTER, colorWhite );
738
static void Controls_DrawPlayer( void *self ) {
742
trap_Cvar_VariableStringBuffer( "model", buf, sizeof( buf ) );
743
if ( strcmp( buf, s_controls.playerModel ) != 0 ) {
744
UI_PlayerInfo_SetModel( &s_controls.playerinfo, buf );
745
strcpy( s_controls.playerModel, buf );
746
Controls_UpdateModel( ANIM_IDLE );
749
b = (menubitmap_s*) self;
750
UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_controls.playerinfo, uis.realtime/2 );
756
Controls_GetKeyAssignment
759
static void Controls_GetKeyAssignment (char *command, int *twokeys)
765
twokeys[0] = twokeys[1] = -1;
768
for ( j = 0; j < 256; j++ )
770
trap_Key_GetBindingBuf( j, b, 256 );
774
if ( !Q_stricmp( b, command ) ) {
788
static void Controls_GetConfig( void )
794
// put the bindings into a local store
795
bindptr = g_bindings;
797
// iterate each command, get its numeric binding
798
for (i=0; ;i++,bindptr++)
803
Controls_GetKeyAssignment(bindptr->command, twokeys);
805
bindptr->bind1 = twokeys[0];
806
bindptr->bind2 = twokeys[1];
809
s_controls.invertmouse.curvalue = Controls_GetCvarValue( "m_pitch" ) < 0;
810
s_controls.smoothmouse.curvalue = UI_ClampCvar( 0, 1, Controls_GetCvarValue( "m_filter" ) );
811
s_controls.alwaysrun.curvalue = UI_ClampCvar( 0, 1, Controls_GetCvarValue( "cl_run" ) );
812
s_controls.autoswitch.curvalue = UI_ClampCvar( 0, 1, Controls_GetCvarValue( "cg_autoswitch" ) );
813
s_controls.sensitivity.curvalue = UI_ClampCvar( 2, 30, Controls_GetCvarValue( "sensitivity" ) );
814
s_controls.joyenable.curvalue = UI_ClampCvar( 0, 1, Controls_GetCvarValue( "in_joystick" ) );
815
s_controls.joythreshold.curvalue = UI_ClampCvar( 0.05f, 0.75f, Controls_GetCvarValue( "joy_threshold" ) );
816
s_controls.freelook.curvalue = UI_ClampCvar( 0, 1, Controls_GetCvarValue( "cl_freelook" ) );
824
static void Controls_SetConfig( void )
829
// set the bindings from the local store
830
bindptr = g_bindings;
832
// iterate each command, get its numeric binding
833
for (i=0; ;i++,bindptr++)
838
if (bindptr->bind1 != -1)
840
trap_Key_SetBinding( bindptr->bind1, bindptr->command );
842
if (bindptr->bind2 != -1)
843
trap_Key_SetBinding( bindptr->bind2, bindptr->command );
847
if ( s_controls.invertmouse.curvalue )
848
trap_Cvar_SetValue( "m_pitch", -fabs( trap_Cvar_VariableValue( "m_pitch" ) ) );
850
trap_Cvar_SetValue( "m_pitch", fabs( trap_Cvar_VariableValue( "m_pitch" ) ) );
852
trap_Cvar_SetValue( "m_filter", s_controls.smoothmouse.curvalue );
853
trap_Cvar_SetValue( "cl_run", s_controls.alwaysrun.curvalue );
854
trap_Cvar_SetValue( "cg_autoswitch", s_controls.autoswitch.curvalue );
855
trap_Cvar_SetValue( "sensitivity", s_controls.sensitivity.curvalue );
856
trap_Cvar_SetValue( "in_joystick", s_controls.joyenable.curvalue );
857
trap_Cvar_SetValue( "joy_threshold", s_controls.joythreshold.curvalue );
858
trap_Cvar_SetValue( "cl_freelook", s_controls.freelook.curvalue );
859
trap_Cmd_ExecuteText( EXEC_APPEND, "in_restart\n" );
867
static void Controls_SetDefaults( void )
872
// set the bindings from the local store
873
bindptr = g_bindings;
875
// iterate each command, set its default binding
876
for (i=0; ;i++,bindptr++)
881
bindptr->bind1 = bindptr->defaultbind1;
882
bindptr->bind2 = bindptr->defaultbind2;
885
s_controls.invertmouse.curvalue = Controls_GetCvarDefault( "m_pitch" ) < 0;
886
s_controls.smoothmouse.curvalue = Controls_GetCvarDefault( "m_filter" );
887
s_controls.alwaysrun.curvalue = Controls_GetCvarDefault( "cl_run" );
888
s_controls.autoswitch.curvalue = Controls_GetCvarDefault( "cg_autoswitch" );
889
s_controls.sensitivity.curvalue = Controls_GetCvarDefault( "sensitivity" );
890
s_controls.joyenable.curvalue = Controls_GetCvarDefault( "in_joystick" );
891
s_controls.joythreshold.curvalue = Controls_GetCvarDefault( "joy_threshold" );
892
s_controls.freelook.curvalue = Controls_GetCvarDefault( "cl_freelook" );
900
static sfxHandle_t Controls_MenuKey( int key )
908
if (!s_controls.waitingforkey)
920
if (s_controls.changesmade)
921
Controls_SetConfig();
930
if (key & K_CHAR_FLAG)
936
s_controls.waitingforkey = qfalse;
938
return (menu_out_sound);
945
s_controls.changesmade = qtrue;
949
// remove from any other bind
950
bindptr = g_bindings;
951
for (i=0; ;i++,bindptr++)
956
if (bindptr->bind2 == key)
959
if (bindptr->bind1 == key)
961
bindptr->bind1 = bindptr->bind2;
967
// assign key to local store
968
id = ((menucommon_s*)(s_controls.menu.items[s_controls.menu.cursor]))->id;
969
bindptr = g_bindings;
970
for (i=0; ;i++,bindptr++)
975
if (bindptr->id == id)
980
if( bindptr->bind1 != -1 ) {
981
trap_Key_SetBinding( bindptr->bind1, "" );
984
if( bindptr->bind2 != -1 ) {
985
trap_Key_SetBinding( bindptr->bind2, "" );
989
else if (bindptr->bind1 == -1) {
990
bindptr->bind1 = key;
992
else if (bindptr->bind1 != key && bindptr->bind2 == -1) {
993
bindptr->bind2 = key;
997
trap_Key_SetBinding( bindptr->bind1, "" );
998
trap_Key_SetBinding( bindptr->bind2, "" );
999
bindptr->bind1 = key;
1000
bindptr->bind2 = -1;
1006
s_controls.waitingforkey = qfalse;
1011
return (menu_out_sound);
1015
return Menu_DefaultKey( &s_controls.menu, key );
1020
Controls_ResetDefaults_Action
1023
static void Controls_ResetDefaults_Action( qboolean result ) {
1028
s_controls.changesmade = qtrue;
1029
Controls_SetDefaults();
1035
Controls_ResetDefaults_Draw
1038
static void Controls_ResetDefaults_Draw( void ) {
1039
UI_DrawProportionalString( SCREEN_WIDTH/2, 356 + PROP_HEIGHT * 0, "WARNING: This will reset all", UI_CENTER|UI_SMALLFONT, color_yellow );
1040
UI_DrawProportionalString( SCREEN_WIDTH/2, 356 + PROP_HEIGHT * 1, "controls to their default values.", UI_CENTER|UI_SMALLFONT, color_yellow );
1048
static void Controls_MenuEvent( void* ptr, int event )
1050
switch (((menucommon_s*)ptr)->id)
1053
if (event == QM_ACTIVATED)
1055
s_controls.section = C_MOVEMENT;
1061
if (event == QM_ACTIVATED)
1063
s_controls.section = C_LOOKING;
1069
if (event == QM_ACTIVATED)
1071
s_controls.section = C_WEAPONS;
1077
if (event == QM_ACTIVATED)
1079
s_controls.section = C_MISC;
1085
if (event == QM_ACTIVATED)
1087
UI_ConfirmMenu( "SET TO DEFAULTS?", Controls_ResetDefaults_Draw, Controls_ResetDefaults_Action );
1092
if (event == QM_ACTIVATED)
1094
if (s_controls.changesmade)
1095
Controls_SetConfig();
1100
case ID_SAVEANDEXIT:
1101
if (event == QM_ACTIVATED)
1103
Controls_SetConfig();
1109
if (event == QM_ACTIVATED)
1117
case ID_INVERTMOUSE:
1118
case ID_SMOOTHMOUSE:
1122
case ID_JOYTHRESHOLD:
1123
if (event == QM_ACTIVATED)
1125
s_controls.changesmade = qtrue;
1133
Controls_ActionEvent
1136
static void Controls_ActionEvent( void* ptr, int event )
1138
if (event == QM_LOSTFOCUS)
1140
Controls_UpdateModel( ANIM_IDLE );
1142
else if (event == QM_GOTFOCUS)
1144
Controls_UpdateModel( g_bindings[((menucommon_s*)ptr)->id].anim );
1146
else if ((event == QM_ACTIVATED) && !s_controls.waitingforkey)
1148
s_controls.waitingforkey = 1;
1158
static void Controls_InitModel( void )
1160
memset( &s_controls.playerinfo, 0, sizeof(playerInfo_t) );
1162
UI_PlayerInfo_SetModel( &s_controls.playerinfo, UI_Cvar_VariableString( "model" ) );
1164
Controls_UpdateModel( ANIM_IDLE );
1169
Controls_InitWeapons
1172
static void Controls_InitWeapons( void ) {
1175
for ( item = bg_itemlist + 1 ; item->classname ; item++ ) {
1176
if ( item->giType != IT_WEAPON ) {
1179
trap_R_RegisterModel( item->world_model[0] );
1188
static void Controls_MenuInit( void )
1190
static char playername[32];
1192
// zero set all our globals
1193
memset( &s_controls, 0 ,sizeof(controls_t) );
1197
s_controls.menu.key = Controls_MenuKey;
1198
s_controls.menu.wrapAround = qtrue;
1199
s_controls.menu.fullscreen = qtrue;
1201
s_controls.banner.generic.type = MTYPE_BTEXT;
1202
s_controls.banner.generic.flags = QMF_CENTER_JUSTIFY;
1203
s_controls.banner.generic.x = 320;
1204
s_controls.banner.generic.y = 16;
1205
s_controls.banner.string = "CONTROLS";
1206
s_controls.banner.color = color_white;
1207
s_controls.banner.style = UI_CENTER;
1209
s_controls.framel.generic.type = MTYPE_BITMAP;
1210
s_controls.framel.generic.name = ART_FRAMEL;
1211
s_controls.framel.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
1212
s_controls.framel.generic.x = 0;
1213
s_controls.framel.generic.y = 78;
1214
s_controls.framel.width = 256;
1215
s_controls.framel.height = 329;
1217
s_controls.framer.generic.type = MTYPE_BITMAP;
1218
s_controls.framer.generic.name = ART_FRAMER;
1219
s_controls.framer.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
1220
s_controls.framer.generic.x = 376;
1221
s_controls.framer.generic.y = 76;
1222
s_controls.framer.width = 256;
1223
s_controls.framer.height = 334;
1225
s_controls.looking.generic.type = MTYPE_PTEXT;
1226
s_controls.looking.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
1227
s_controls.looking.generic.id = ID_LOOKING;
1228
s_controls.looking.generic.callback = Controls_MenuEvent;
1229
s_controls.looking.generic.x = 152;
1230
s_controls.looking.generic.y = 240 - 2 * PROP_HEIGHT;
1231
s_controls.looking.string = "LOOK";
1232
s_controls.looking.style = UI_RIGHT;
1233
s_controls.looking.color = color_red;
1235
s_controls.movement.generic.type = MTYPE_PTEXT;
1236
s_controls.movement.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
1237
s_controls.movement.generic.id = ID_MOVEMENT;
1238
s_controls.movement.generic.callback = Controls_MenuEvent;
1239
s_controls.movement.generic.x = 152;
1240
s_controls.movement.generic.y = 240 - PROP_HEIGHT;
1241
s_controls.movement.string = "MOVE";
1242
s_controls.movement.style = UI_RIGHT;
1243
s_controls.movement.color = color_red;
1245
s_controls.weapons.generic.type = MTYPE_PTEXT;
1246
s_controls.weapons.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
1247
s_controls.weapons.generic.id = ID_WEAPONS;
1248
s_controls.weapons.generic.callback = Controls_MenuEvent;
1249
s_controls.weapons.generic.x = 152;
1250
s_controls.weapons.generic.y = 240;
1251
s_controls.weapons.string = "SHOOT";
1252
s_controls.weapons.style = UI_RIGHT;
1253
s_controls.weapons.color = color_red;
1255
s_controls.misc.generic.type = MTYPE_PTEXT;
1256
s_controls.misc.generic.flags = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
1257
s_controls.misc.generic.id = ID_MISC;
1258
s_controls.misc.generic.callback = Controls_MenuEvent;
1259
s_controls.misc.generic.x = 152;
1260
s_controls.misc.generic.y = 240 + PROP_HEIGHT;
1261
s_controls.misc.string = "MISC";
1262
s_controls.misc.style = UI_RIGHT;
1263
s_controls.misc.color = color_red;
1265
s_controls.back.generic.type = MTYPE_BITMAP;
1266
s_controls.back.generic.name = ART_BACK0;
1267
s_controls.back.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
1268
s_controls.back.generic.x = 0;
1269
s_controls.back.generic.y = 480-64;
1270
s_controls.back.generic.id = ID_BACK;
1271
s_controls.back.generic.callback = Controls_MenuEvent;
1272
s_controls.back.width = 128;
1273
s_controls.back.height = 64;
1274
s_controls.back.focuspic = ART_BACK1;
1276
s_controls.player.generic.type = MTYPE_BITMAP;
1277
s_controls.player.generic.flags = QMF_INACTIVE;
1278
s_controls.player.generic.ownerdraw = Controls_DrawPlayer;
1279
s_controls.player.generic.x = 400;
1280
s_controls.player.generic.y = -40;
1281
s_controls.player.width = 32*10;
1282
s_controls.player.height = 56*10;
1284
s_controls.walkforward.generic.type = MTYPE_ACTION;
1285
s_controls.walkforward.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1286
s_controls.walkforward.generic.callback = Controls_ActionEvent;
1287
s_controls.walkforward.generic.ownerdraw = Controls_DrawKeyBinding;
1288
s_controls.walkforward.generic.id = ID_FORWARD;
1290
s_controls.backpedal.generic.type = MTYPE_ACTION;
1291
s_controls.backpedal.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1292
s_controls.backpedal.generic.callback = Controls_ActionEvent;
1293
s_controls.backpedal.generic.ownerdraw = Controls_DrawKeyBinding;
1294
s_controls.backpedal.generic.id = ID_BACKPEDAL;
1296
s_controls.stepleft.generic.type = MTYPE_ACTION;
1297
s_controls.stepleft.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1298
s_controls.stepleft.generic.callback = Controls_ActionEvent;
1299
s_controls.stepleft.generic.ownerdraw = Controls_DrawKeyBinding;
1300
s_controls.stepleft.generic.id = ID_MOVELEFT;
1302
s_controls.stepright.generic.type = MTYPE_ACTION;
1303
s_controls.stepright.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1304
s_controls.stepright.generic.callback = Controls_ActionEvent;
1305
s_controls.stepright.generic.ownerdraw = Controls_DrawKeyBinding;
1306
s_controls.stepright.generic.id = ID_MOVERIGHT;
1308
s_controls.moveup.generic.type = MTYPE_ACTION;
1309
s_controls.moveup.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1310
s_controls.moveup.generic.callback = Controls_ActionEvent;
1311
s_controls.moveup.generic.ownerdraw = Controls_DrawKeyBinding;
1312
s_controls.moveup.generic.id = ID_MOVEUP;
1314
s_controls.movedown.generic.type = MTYPE_ACTION;
1315
s_controls.movedown.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1316
s_controls.movedown.generic.callback = Controls_ActionEvent;
1317
s_controls.movedown.generic.ownerdraw = Controls_DrawKeyBinding;
1318
s_controls.movedown.generic.id = ID_MOVEDOWN;
1320
s_controls.turnleft.generic.type = MTYPE_ACTION;
1321
s_controls.turnleft.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1322
s_controls.turnleft.generic.callback = Controls_ActionEvent;
1323
s_controls.turnleft.generic.ownerdraw = Controls_DrawKeyBinding;
1324
s_controls.turnleft.generic.id = ID_LEFT;
1326
s_controls.turnright.generic.type = MTYPE_ACTION;
1327
s_controls.turnright.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1328
s_controls.turnright.generic.callback = Controls_ActionEvent;
1329
s_controls.turnright.generic.ownerdraw = Controls_DrawKeyBinding;
1330
s_controls.turnright.generic.id = ID_RIGHT;
1332
s_controls.sidestep.generic.type = MTYPE_ACTION;
1333
s_controls.sidestep.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1334
s_controls.sidestep.generic.callback = Controls_ActionEvent;
1335
s_controls.sidestep.generic.ownerdraw = Controls_DrawKeyBinding;
1336
s_controls.sidestep.generic.id = ID_STRAFE;
1338
s_controls.run.generic.type = MTYPE_ACTION;
1339
s_controls.run.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1340
s_controls.run.generic.callback = Controls_ActionEvent;
1341
s_controls.run.generic.ownerdraw = Controls_DrawKeyBinding;
1342
s_controls.run.generic.id = ID_SPEED;
1344
s_controls.chainsaw.generic.type = MTYPE_ACTION;
1345
s_controls.chainsaw.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1346
s_controls.chainsaw.generic.callback = Controls_ActionEvent;
1347
s_controls.chainsaw.generic.ownerdraw = Controls_DrawKeyBinding;
1348
s_controls.chainsaw.generic.id = ID_WEAPON1;
1350
s_controls.machinegun.generic.type = MTYPE_ACTION;
1351
s_controls.machinegun.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1352
s_controls.machinegun.generic.callback = Controls_ActionEvent;
1353
s_controls.machinegun.generic.ownerdraw = Controls_DrawKeyBinding;
1354
s_controls.machinegun.generic.id = ID_WEAPON2;
1356
s_controls.shotgun.generic.type = MTYPE_ACTION;
1357
s_controls.shotgun.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1358
s_controls.shotgun.generic.callback = Controls_ActionEvent;
1359
s_controls.shotgun.generic.ownerdraw = Controls_DrawKeyBinding;
1360
s_controls.shotgun.generic.id = ID_WEAPON3;
1362
s_controls.grenadelauncher.generic.type = MTYPE_ACTION;
1363
s_controls.grenadelauncher.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1364
s_controls.grenadelauncher.generic.callback = Controls_ActionEvent;
1365
s_controls.grenadelauncher.generic.ownerdraw = Controls_DrawKeyBinding;
1366
s_controls.grenadelauncher.generic.id = ID_WEAPON4;
1368
s_controls.rocketlauncher.generic.type = MTYPE_ACTION;
1369
s_controls.rocketlauncher.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1370
s_controls.rocketlauncher.generic.callback = Controls_ActionEvent;
1371
s_controls.rocketlauncher.generic.ownerdraw = Controls_DrawKeyBinding;
1372
s_controls.rocketlauncher.generic.id = ID_WEAPON5;
1374
s_controls.lightning.generic.type = MTYPE_ACTION;
1375
s_controls.lightning.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1376
s_controls.lightning.generic.callback = Controls_ActionEvent;
1377
s_controls.lightning.generic.ownerdraw = Controls_DrawKeyBinding;
1378
s_controls.lightning.generic.id = ID_WEAPON6;
1380
s_controls.railgun.generic.type = MTYPE_ACTION;
1381
s_controls.railgun.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1382
s_controls.railgun.generic.callback = Controls_ActionEvent;
1383
s_controls.railgun.generic.ownerdraw = Controls_DrawKeyBinding;
1384
s_controls.railgun.generic.id = ID_WEAPON7;
1386
s_controls.plasma.generic.type = MTYPE_ACTION;
1387
s_controls.plasma.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1388
s_controls.plasma.generic.callback = Controls_ActionEvent;
1389
s_controls.plasma.generic.ownerdraw = Controls_DrawKeyBinding;
1390
s_controls.plasma.generic.id = ID_WEAPON8;
1392
s_controls.bfg.generic.type = MTYPE_ACTION;
1393
s_controls.bfg.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1394
s_controls.bfg.generic.callback = Controls_ActionEvent;
1395
s_controls.bfg.generic.ownerdraw = Controls_DrawKeyBinding;
1396
s_controls.bfg.generic.id = ID_WEAPON9;
1398
s_controls.attack.generic.type = MTYPE_ACTION;
1399
s_controls.attack.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1400
s_controls.attack.generic.callback = Controls_ActionEvent;
1401
s_controls.attack.generic.ownerdraw = Controls_DrawKeyBinding;
1402
s_controls.attack.generic.id = ID_ATTACK;
1404
s_controls.prevweapon.generic.type = MTYPE_ACTION;
1405
s_controls.prevweapon.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1406
s_controls.prevweapon.generic.callback = Controls_ActionEvent;
1407
s_controls.prevweapon.generic.ownerdraw = Controls_DrawKeyBinding;
1408
s_controls.prevweapon.generic.id = ID_WEAPPREV;
1410
s_controls.nextweapon.generic.type = MTYPE_ACTION;
1411
s_controls.nextweapon.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1412
s_controls.nextweapon.generic.callback = Controls_ActionEvent;
1413
s_controls.nextweapon.generic.ownerdraw = Controls_DrawKeyBinding;
1414
s_controls.nextweapon.generic.id = ID_WEAPNEXT;
1416
s_controls.lookup.generic.type = MTYPE_ACTION;
1417
s_controls.lookup.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1418
s_controls.lookup.generic.callback = Controls_ActionEvent;
1419
s_controls.lookup.generic.ownerdraw = Controls_DrawKeyBinding;
1420
s_controls.lookup.generic.id = ID_LOOKUP;
1422
s_controls.lookdown.generic.type = MTYPE_ACTION;
1423
s_controls.lookdown.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1424
s_controls.lookdown.generic.callback = Controls_ActionEvent;
1425
s_controls.lookdown.generic.ownerdraw = Controls_DrawKeyBinding;
1426
s_controls.lookdown.generic.id = ID_LOOKDOWN;
1428
s_controls.mouselook.generic.type = MTYPE_ACTION;
1429
s_controls.mouselook.generic.flags = QMF_LEFT_JUSTIFY|QMF_HIGHLIGHT_IF_FOCUS|QMF_GRAYED|QMF_HIDDEN;
1430
s_controls.mouselook.generic.callback = Controls_ActionEvent;
1431
s_controls.mouselook.generic.ownerdraw = Controls_DrawKeyBinding;
1432
s_controls.mouselook.generic.id = ID_MOUSELOOK;
1434
s_controls.freelook.generic.type = MTYPE_RADIOBUTTON;
1435
s_controls.freelook.generic.flags = QMF_SMALLFONT;
1436
s_controls.freelook.generic.x = SCREEN_WIDTH/2;
1437
s_controls.freelook.generic.name = "free look";
1438
s_controls.freelook.generic.id = ID_FREELOOK;
1439
s_controls.freelook.generic.callback = Controls_MenuEvent;
1440
s_controls.freelook.generic.statusbar = Controls_StatusBar;
1442
s_controls.centerview.generic.type = MTYPE_ACTION;
1443
s_controls.centerview.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1444
s_controls.centerview.generic.callback = Controls_ActionEvent;
1445
s_controls.centerview.generic.ownerdraw = Controls_DrawKeyBinding;
1446
s_controls.centerview.generic.id = ID_CENTERVIEW;
1448
s_controls.zoomview.generic.type = MTYPE_ACTION;
1449
s_controls.zoomview.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1450
s_controls.zoomview.generic.callback = Controls_ActionEvent;
1451
s_controls.zoomview.generic.ownerdraw = Controls_DrawKeyBinding;
1452
s_controls.zoomview.generic.id = ID_ZOOMVIEW;
1454
s_controls.useitem.generic.type = MTYPE_ACTION;
1455
s_controls.useitem.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1456
s_controls.useitem.generic.callback = Controls_ActionEvent;
1457
s_controls.useitem.generic.ownerdraw = Controls_DrawKeyBinding;
1458
s_controls.useitem.generic.id = ID_USEITEM;
1460
s_controls.showscores.generic.type = MTYPE_ACTION;
1461
s_controls.showscores.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1462
s_controls.showscores.generic.callback = Controls_ActionEvent;
1463
s_controls.showscores.generic.ownerdraw = Controls_DrawKeyBinding;
1464
s_controls.showscores.generic.id = ID_SHOWSCORES;
1466
s_controls.invertmouse.generic.type = MTYPE_RADIOBUTTON;
1467
s_controls.invertmouse.generic.flags = QMF_SMALLFONT;
1468
s_controls.invertmouse.generic.x = SCREEN_WIDTH/2;
1469
s_controls.invertmouse.generic.name = "invert mouse";
1470
s_controls.invertmouse.generic.id = ID_INVERTMOUSE;
1471
s_controls.invertmouse.generic.callback = Controls_MenuEvent;
1472
s_controls.invertmouse.generic.statusbar = Controls_StatusBar;
1474
s_controls.smoothmouse.generic.type = MTYPE_RADIOBUTTON;
1475
s_controls.smoothmouse.generic.flags = QMF_SMALLFONT;
1476
s_controls.smoothmouse.generic.x = SCREEN_WIDTH/2;
1477
s_controls.smoothmouse.generic.name = "smooth mouse";
1478
s_controls.smoothmouse.generic.id = ID_SMOOTHMOUSE;
1479
s_controls.smoothmouse.generic.callback = Controls_MenuEvent;
1480
s_controls.smoothmouse.generic.statusbar = Controls_StatusBar;
1482
s_controls.alwaysrun.generic.type = MTYPE_RADIOBUTTON;
1483
s_controls.alwaysrun.generic.flags = QMF_SMALLFONT;
1484
s_controls.alwaysrun.generic.x = SCREEN_WIDTH/2;
1485
s_controls.alwaysrun.generic.name = "always run";
1486
s_controls.alwaysrun.generic.id = ID_ALWAYSRUN;
1487
s_controls.alwaysrun.generic.callback = Controls_MenuEvent;
1488
s_controls.alwaysrun.generic.statusbar = Controls_StatusBar;
1490
s_controls.autoswitch.generic.type = MTYPE_RADIOBUTTON;
1491
s_controls.autoswitch.generic.flags = QMF_SMALLFONT;
1492
s_controls.autoswitch.generic.x = SCREEN_WIDTH/2;
1493
s_controls.autoswitch.generic.name = "autoswitch weapons";
1494
s_controls.autoswitch.generic.id = ID_AUTOSWITCH;
1495
s_controls.autoswitch.generic.callback = Controls_MenuEvent;
1496
s_controls.autoswitch.generic.statusbar = Controls_StatusBar;
1498
s_controls.sensitivity.generic.type = MTYPE_SLIDER;
1499
s_controls.sensitivity.generic.x = SCREEN_WIDTH/2;
1500
s_controls.sensitivity.generic.flags = QMF_SMALLFONT;
1501
s_controls.sensitivity.generic.name = "mouse speed";
1502
s_controls.sensitivity.generic.id = ID_MOUSESPEED;
1503
s_controls.sensitivity.generic.callback = Controls_MenuEvent;
1504
s_controls.sensitivity.minvalue = 2;
1505
s_controls.sensitivity.maxvalue = 30;
1506
s_controls.sensitivity.generic.statusbar = Controls_StatusBar;
1508
s_controls.gesture.generic.type = MTYPE_ACTION;
1509
s_controls.gesture.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1510
s_controls.gesture.generic.callback = Controls_ActionEvent;
1511
s_controls.gesture.generic.ownerdraw = Controls_DrawKeyBinding;
1512
s_controls.gesture.generic.id = ID_GESTURE;
1514
s_controls.chat.generic.type = MTYPE_ACTION;
1515
s_controls.chat.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1516
s_controls.chat.generic.callback = Controls_ActionEvent;
1517
s_controls.chat.generic.ownerdraw = Controls_DrawKeyBinding;
1518
s_controls.chat.generic.id = ID_CHAT;
1520
s_controls.chat2.generic.type = MTYPE_ACTION;
1521
s_controls.chat2.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1522
s_controls.chat2.generic.callback = Controls_ActionEvent;
1523
s_controls.chat2.generic.ownerdraw = Controls_DrawKeyBinding;
1524
s_controls.chat2.generic.id = ID_CHAT2;
1526
s_controls.chat3.generic.type = MTYPE_ACTION;
1527
s_controls.chat3.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1528
s_controls.chat3.generic.callback = Controls_ActionEvent;
1529
s_controls.chat3.generic.ownerdraw = Controls_DrawKeyBinding;
1530
s_controls.chat3.generic.id = ID_CHAT3;
1532
s_controls.chat4.generic.type = MTYPE_ACTION;
1533
s_controls.chat4.generic.flags = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS|QMF_GRAYED|QMF_HIDDEN;
1534
s_controls.chat4.generic.callback = Controls_ActionEvent;
1535
s_controls.chat4.generic.ownerdraw = Controls_DrawKeyBinding;
1536
s_controls.chat4.generic.id = ID_CHAT4;
1538
s_controls.joyenable.generic.type = MTYPE_RADIOBUTTON;
1539
s_controls.joyenable.generic.flags = QMF_SMALLFONT;
1540
s_controls.joyenable.generic.x = SCREEN_WIDTH/2;
1541
s_controls.joyenable.generic.name = "joystick";
1542
s_controls.joyenable.generic.id = ID_JOYENABLE;
1543
s_controls.joyenable.generic.callback = Controls_MenuEvent;
1544
s_controls.joyenable.generic.statusbar = Controls_StatusBar;
1546
s_controls.joythreshold.generic.type = MTYPE_SLIDER;
1547
s_controls.joythreshold.generic.x = SCREEN_WIDTH/2;
1548
s_controls.joythreshold.generic.flags = QMF_SMALLFONT;
1549
s_controls.joythreshold.generic.name = "joystick threshold";
1550
s_controls.joythreshold.generic.id = ID_JOYTHRESHOLD;
1551
s_controls.joythreshold.generic.callback = Controls_MenuEvent;
1552
s_controls.joythreshold.minvalue = 0.05f;
1553
s_controls.joythreshold.maxvalue = 0.75f;
1554
s_controls.joythreshold.generic.statusbar = Controls_StatusBar;
1556
s_controls.name.generic.type = MTYPE_PTEXT;
1557
s_controls.name.generic.flags = QMF_CENTER_JUSTIFY|QMF_INACTIVE;
1558
s_controls.name.generic.x = 320;
1559
s_controls.name.generic.y = 440;
1560
s_controls.name.string = playername;
1561
s_controls.name.style = UI_CENTER;
1562
s_controls.name.color = text_color_normal;
1564
Menu_AddItem( &s_controls.menu, &s_controls.banner );
1565
Menu_AddItem( &s_controls.menu, &s_controls.framel );
1566
Menu_AddItem( &s_controls.menu, &s_controls.framer );
1567
Menu_AddItem( &s_controls.menu, &s_controls.player );
1568
Menu_AddItem( &s_controls.menu, &s_controls.name );
1570
Menu_AddItem( &s_controls.menu, &s_controls.looking );
1571
Menu_AddItem( &s_controls.menu, &s_controls.movement );
1572
Menu_AddItem( &s_controls.menu, &s_controls.weapons );
1573
Menu_AddItem( &s_controls.menu, &s_controls.misc );
1575
Menu_AddItem( &s_controls.menu, &s_controls.sensitivity );
1576
Menu_AddItem( &s_controls.menu, &s_controls.smoothmouse );
1577
Menu_AddItem( &s_controls.menu, &s_controls.invertmouse );
1578
Menu_AddItem( &s_controls.menu, &s_controls.lookup );
1579
Menu_AddItem( &s_controls.menu, &s_controls.lookdown );
1580
Menu_AddItem( &s_controls.menu, &s_controls.mouselook );
1581
Menu_AddItem( &s_controls.menu, &s_controls.freelook );
1582
Menu_AddItem( &s_controls.menu, &s_controls.centerview );
1583
Menu_AddItem( &s_controls.menu, &s_controls.zoomview );
1584
Menu_AddItem( &s_controls.menu, &s_controls.joyenable );
1585
Menu_AddItem( &s_controls.menu, &s_controls.joythreshold );
1587
Menu_AddItem( &s_controls.menu, &s_controls.alwaysrun );
1588
Menu_AddItem( &s_controls.menu, &s_controls.run );
1589
Menu_AddItem( &s_controls.menu, &s_controls.walkforward );
1590
Menu_AddItem( &s_controls.menu, &s_controls.backpedal );
1591
Menu_AddItem( &s_controls.menu, &s_controls.stepleft );
1592
Menu_AddItem( &s_controls.menu, &s_controls.stepright );
1593
Menu_AddItem( &s_controls.menu, &s_controls.moveup );
1594
Menu_AddItem( &s_controls.menu, &s_controls.movedown );
1595
Menu_AddItem( &s_controls.menu, &s_controls.turnleft );
1596
Menu_AddItem( &s_controls.menu, &s_controls.turnright );
1597
Menu_AddItem( &s_controls.menu, &s_controls.sidestep );
1599
Menu_AddItem( &s_controls.menu, &s_controls.attack );
1600
Menu_AddItem( &s_controls.menu, &s_controls.nextweapon );
1601
Menu_AddItem( &s_controls.menu, &s_controls.prevweapon );
1602
Menu_AddItem( &s_controls.menu, &s_controls.autoswitch );
1603
Menu_AddItem( &s_controls.menu, &s_controls.chainsaw );
1604
Menu_AddItem( &s_controls.menu, &s_controls.machinegun );
1605
Menu_AddItem( &s_controls.menu, &s_controls.shotgun );
1606
Menu_AddItem( &s_controls.menu, &s_controls.grenadelauncher );
1607
Menu_AddItem( &s_controls.menu, &s_controls.rocketlauncher );
1608
Menu_AddItem( &s_controls.menu, &s_controls.lightning );
1609
Menu_AddItem( &s_controls.menu, &s_controls.railgun );
1610
Menu_AddItem( &s_controls.menu, &s_controls.plasma );
1611
Menu_AddItem( &s_controls.menu, &s_controls.bfg );
1613
Menu_AddItem( &s_controls.menu, &s_controls.showscores );
1614
Menu_AddItem( &s_controls.menu, &s_controls.useitem );
1615
Menu_AddItem( &s_controls.menu, &s_controls.gesture );
1616
Menu_AddItem( &s_controls.menu, &s_controls.chat );
1617
Menu_AddItem( &s_controls.menu, &s_controls.chat2 );
1618
Menu_AddItem( &s_controls.menu, &s_controls.chat3 );
1619
Menu_AddItem( &s_controls.menu, &s_controls.chat4 );
1621
Menu_AddItem( &s_controls.menu, &s_controls.back );
1623
trap_Cvar_VariableStringBuffer( "name", s_controls.name.string, 16 );
1624
Q_CleanStr( s_controls.name.string );
1626
// initialize the configurable cvars
1627
Controls_InitCvars();
1629
// initialize the current config
1630
Controls_GetConfig();
1632
// intialize the model
1633
Controls_InitModel();
1635
// intialize the weapons
1636
Controls_InitWeapons ();
1638
// initial default section
1639
s_controls.section = C_LOOKING;
1651
void Controls_Cache( void ) {
1652
trap_R_RegisterShaderNoMip( ART_BACK0 );
1653
trap_R_RegisterShaderNoMip( ART_BACK1 );
1654
trap_R_RegisterShaderNoMip( ART_FRAMEL );
1655
trap_R_RegisterShaderNoMip( ART_FRAMER );
1664
void UI_ControlsMenu( void ) {
1665
Controls_MenuInit();
1666
UI_PushMenu( &s_controls.menu );