~ubuntu-branches/ubuntu/precise/openarena/precise

« back to all changes in this revision

Viewing changes to code/q3_ui/ui_controls2.c

  • Committer: Bazaar Package Importer
  • Author(s): Bruno "Fuddl" Kleinert
  • Date: 2007-01-20 12:28:09 UTC
  • Revision ID: james.westby@ubuntu.com-20070120122809-2yza5ojt7nqiyiam
Tags: upstream-0.6.0
ImportĀ upstreamĀ versionĀ 0.6.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
===========================================================================
 
3
Copyright (C) 1999-2005 Id Software, Inc.
 
4
 
 
5
This file is part of Quake III Arena source code.
 
6
 
 
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.
 
11
 
 
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.
 
16
 
 
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
===========================================================================
 
21
*/
 
22
//
 
23
/*
 
24
=======================================================================
 
25
 
 
26
CONTROLS MENU
 
27
 
 
28
=======================================================================
 
29
*/
 
30
 
 
31
 
 
32
#include "ui_local.h"
 
33
 
 
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"
 
38
 
 
39
 
 
40
typedef struct {
 
41
        char    *command;
 
42
        char    *label;
 
43
        int             id;
 
44
        int             anim;
 
45
        int             defaultbind1;
 
46
        int             defaultbind2;
 
47
        int             bind1;
 
48
        int             bind2;
 
49
} bind_t;
 
50
 
 
51
typedef struct
 
52
{
 
53
        char*   name;
 
54
        float   defaultvalue;
 
55
        float   value;  
 
56
} configcvar_t;
 
57
 
 
58
#define SAVE_NOOP               0
 
59
#define SAVE_YES                1
 
60
#define SAVE_NO                 2
 
61
#define SAVE_CANCEL             3
 
62
 
 
63
// control sections
 
64
#define C_MOVEMENT              0
 
65
#define C_LOOKING               1
 
66
#define C_WEAPONS               2
 
67
#define C_MISC                  3
 
68
#define C_MAX                   4
 
69
 
 
70
#define ID_MOVEMENT             100
 
71
#define ID_LOOKING              101
 
72
#define ID_WEAPONS              102
 
73
#define ID_MISC                 103
 
74
#define ID_DEFAULTS             104
 
75
#define ID_BACK                 105
 
76
#define ID_SAVEANDEXIT  106
 
77
#define ID_EXIT                 107
 
78
 
 
79
// bindable actions
 
80
#define ID_SHOWSCORES   0
 
81
#define ID_USEITEM              1       
 
82
#define ID_SPEED                2       
 
83
#define ID_FORWARD              3       
 
84
#define ID_BACKPEDAL    4
 
85
#define ID_MOVELEFT             5
 
86
#define ID_MOVERIGHT    6
 
87
#define ID_MOVEUP               7       
 
88
#define ID_MOVEDOWN             8
 
89
#define ID_LEFT                 9       
 
90
#define ID_RIGHT                10      
 
91
#define ID_STRAFE               11      
 
92
#define ID_LOOKUP               12      
 
93
#define ID_LOOKDOWN             13
 
94
#define ID_MOUSELOOK    14
 
95
#define ID_CENTERVIEW   15
 
96
#define ID_ZOOMVIEW             16
 
97
#define ID_WEAPON1              17      
 
98
#define ID_WEAPON2              18      
 
99
#define ID_WEAPON3              19      
 
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      
 
106
#define ID_ATTACK               26
 
107
#define ID_WEAPPREV             27
 
108
#define ID_WEAPNEXT             28
 
109
#define ID_GESTURE              29
 
110
#define ID_CHAT                 30
 
111
#define ID_CHAT2                31
 
112
#define ID_CHAT3                32
 
113
#define ID_CHAT4                33
 
114
 
 
115
// all others
 
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
 
124
 
 
125
#define ANIM_IDLE               0
 
126
#define ANIM_RUN                1
 
127
#define ANIM_WALK               2
 
128
#define ANIM_BACK               3
 
129
#define ANIM_JUMP               4
 
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
 
149
#define ANIM_DIE                24
 
150
#define ANIM_CHAT               25
 
151
 
 
152
typedef struct
 
153
{
 
154
        menuframework_s         menu;
 
155
 
 
156
        menutext_s                      banner;
 
157
        menubitmap_s            framel;
 
158
        menubitmap_s            framer;
 
159
        menubitmap_s            player;
 
160
 
 
161
        menutext_s                      movement;
 
162
        menutext_s                      looking;
 
163
        menutext_s                      weapons;
 
164
        menutext_s                      misc;
 
165
 
 
166
        menuaction_s            walkforward;
 
167
        menuaction_s            backpedal;
 
168
        menuaction_s            stepleft;
 
169
        menuaction_s            stepright;
 
170
        menuaction_s            moveup;
 
171
        menuaction_s            movedown;
 
172
        menuaction_s            turnleft;
 
173
        menuaction_s            turnright;
 
174
        menuaction_s            sidestep;
 
175
        menuaction_s            run;
 
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;
 
183
        menuaction_s            plasma;
 
184
        menuaction_s            bfg;
 
185
        menuaction_s            attack;
 
186
        menuaction_s            prevweapon;
 
187
        menuaction_s            nextweapon;
 
188
        menuaction_s            lookup;
 
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;
 
204
        menuaction_s            chat;
 
205
        menuaction_s            chat2;
 
206
        menuaction_s            chat3;
 
207
        menuaction_s            chat4;
 
208
        menuradiobutton_s       joyenable;
 
209
        menuslider_s            joythreshold;
 
210
        int                                     section;
 
211
        qboolean                        waitingforkey;
 
212
        char                            playerModel[64];
 
213
        vec3_t                          playerViewangles;
 
214
        vec3_t                          playerMoveangles;
 
215
        int                                     playerLegs;
 
216
        int                                     playerTorso;
 
217
        int                                     playerWeapon;
 
218
        qboolean                        playerChat;
 
219
 
 
220
        menubitmap_s            back;
 
221
        menutext_s                      name;
 
222
} controls_t;   
 
223
 
 
224
static controls_t s_controls;
 
225
 
 
226
static vec4_t controls_binding_color  = {1.00f, 0.43f, 0.00f, 1.00f}; // bk: Win32 C4305
 
227
 
 
228
static bind_t g_bindings[] = 
 
229
{
 
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},
 
265
};
 
266
 
 
267
static configcvar_t g_configcvars[] =
 
268
{
 
269
        {"cl_run",                      0,                                      0},
 
270
        {"m_pitch",                     0,                                      0},
 
271
        {"cg_autoswitch",       0,                                      0},
 
272
        {"sensitivity",         0,                                      0},
 
273
        {"in_joystick",         0,                                      0},
 
274
        {"joy_threshold",       0,                                      0},
 
275
        {"m_filter",            0,                                      0},
 
276
        {"cl_freelook",         0,                                      0},
 
277
        {NULL,                          0,                                      0}
 
278
};
 
279
 
 
280
static menucommon_s *g_movement_controls[] =
 
281
{
 
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,
 
293
        NULL
 
294
};
 
295
 
 
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,              
 
310
        NULL,
 
311
};
 
312
 
 
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,
 
325
        NULL,
 
326
};
 
327
 
 
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,
 
336
        NULL,
 
337
};
 
338
 
 
339
static menucommon_s **g_controls[] = {
 
340
        g_movement_controls,
 
341
        g_looking_controls,
 
342
        g_weapons_controls,
 
343
        g_misc_controls,
 
344
};
 
345
 
 
346
/*
 
347
=================
 
348
Controls_InitCvars
 
349
=================
 
350
*/
 
351
static void Controls_InitCvars( void )
 
352
{
 
353
        int                             i;
 
354
        configcvar_t*   cvarptr;
 
355
 
 
356
        cvarptr = g_configcvars;
 
357
        for (i=0; ;i++,cvarptr++)
 
358
        {
 
359
                if (!cvarptr->name)
 
360
                        break;
 
361
 
 
362
                // get current value
 
363
                cvarptr->value = trap_Cvar_VariableValue( cvarptr->name );
 
364
 
 
365
                // get default value
 
366
                trap_Cvar_Reset( cvarptr->name );
 
367
                cvarptr->defaultvalue = trap_Cvar_VariableValue( cvarptr->name );
 
368
 
 
369
                // restore current value
 
370
                trap_Cvar_SetValue( cvarptr->name, cvarptr->value );
 
371
        }
 
372
}
 
373
 
 
374
/*
 
375
=================
 
376
Controls_GetCvarDefault
 
377
=================
 
378
*/
 
379
static float Controls_GetCvarDefault( char* name )
 
380
{
 
381
        configcvar_t*   cvarptr;
 
382
        int                             i;
 
383
 
 
384
        cvarptr = g_configcvars;
 
385
        for (i=0; ;i++,cvarptr++)
 
386
        {
 
387
                if (!cvarptr->name)
 
388
                        return (0);
 
389
 
 
390
                if (!strcmp(cvarptr->name,name))
 
391
                        break;
 
392
        }
 
393
 
 
394
        return (cvarptr->defaultvalue);
 
395
}
 
396
 
 
397
/*
 
398
=================
 
399
Controls_GetCvarValue
 
400
=================
 
401
*/
 
402
static float Controls_GetCvarValue( char* name )
 
403
{
 
404
        configcvar_t*   cvarptr;
 
405
        int                             i;
 
406
 
 
407
        cvarptr = g_configcvars;
 
408
        for (i=0; ;i++,cvarptr++)
 
409
        {
 
410
                if (!cvarptr->name)
 
411
                        return (0);
 
412
 
 
413
                if (!strcmp(cvarptr->name,name))
 
414
                        break;
 
415
        }
 
416
 
 
417
        return (cvarptr->value);
 
418
}
 
419
 
 
420
 
 
421
/*
 
422
=================
 
423
Controls_UpdateModel
 
424
=================
 
425
*/
 
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;
 
435
 
 
436
        switch( anim ) {
 
437
        case ANIM_RUN:  
 
438
                s_controls.playerLegs = LEGS_RUN;
 
439
                break;
 
440
 
 
441
        case ANIM_WALK: 
 
442
                s_controls.playerLegs = LEGS_WALK;
 
443
                break;
 
444
 
 
445
        case ANIM_BACK: 
 
446
                s_controls.playerLegs = LEGS_BACK;
 
447
                break;
 
448
 
 
449
        case ANIM_JUMP: 
 
450
                s_controls.playerLegs = LEGS_JUMP;
 
451
                break;
 
452
 
 
453
        case ANIM_CROUCH:       
 
454
                s_controls.playerLegs = LEGS_IDLECR;
 
455
                break;
 
456
 
 
457
        case ANIM_TURNLEFT:
 
458
                s_controls.playerViewangles[YAW] += 90;
 
459
                break;
 
460
 
 
461
        case ANIM_TURNRIGHT:
 
462
                s_controls.playerViewangles[YAW] -= 90;
 
463
                break;
 
464
 
 
465
        case ANIM_STEPLEFT:
 
466
                s_controls.playerLegs = LEGS_WALK;
 
467
                s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW] + 90;
 
468
                break;
 
469
 
 
470
        case ANIM_STEPRIGHT:
 
471
                s_controls.playerLegs = LEGS_WALK;
 
472
                s_controls.playerMoveangles[YAW] = s_controls.playerViewangles[YAW] - 90;
 
473
                break;
 
474
 
 
475
        case ANIM_LOOKUP:
 
476
                s_controls.playerViewangles[PITCH] = -45;
 
477
                break;
 
478
 
 
479
        case ANIM_LOOKDOWN:
 
480
                s_controls.playerViewangles[PITCH] = 45;
 
481
                break;
 
482
 
 
483
        case ANIM_WEAPON1:
 
484
                s_controls.playerWeapon = WP_GAUNTLET;
 
485
                break;
 
486
 
 
487
        case ANIM_WEAPON2:
 
488
                s_controls.playerWeapon = WP_MACHINEGUN;
 
489
                break;
 
490
 
 
491
        case ANIM_WEAPON3:
 
492
                s_controls.playerWeapon = WP_SHOTGUN;
 
493
                break;
 
494
 
 
495
        case ANIM_WEAPON4:
 
496
                s_controls.playerWeapon = WP_GRENADE_LAUNCHER;
 
497
                break;
 
498
 
 
499
        case ANIM_WEAPON5:
 
500
                s_controls.playerWeapon = WP_ROCKET_LAUNCHER;
 
501
                break;
 
502
 
 
503
        case ANIM_WEAPON6:
 
504
                s_controls.playerWeapon = WP_LIGHTNING;
 
505
                break;
 
506
 
 
507
        case ANIM_WEAPON7:
 
508
                s_controls.playerWeapon = WP_RAILGUN;
 
509
                break;
 
510
 
 
511
        case ANIM_WEAPON8:
 
512
                s_controls.playerWeapon = WP_PLASMAGUN;
 
513
                break;
 
514
 
 
515
        case ANIM_WEAPON9:
 
516
                s_controls.playerWeapon = WP_BFG;
 
517
                break;
 
518
 
 
519
        case ANIM_WEAPON10:
 
520
                s_controls.playerWeapon = WP_GRAPPLING_HOOK;
 
521
                break;
 
522
 
 
523
        case ANIM_ATTACK:
 
524
                s_controls.playerTorso = TORSO_ATTACK;
 
525
                break;
 
526
 
 
527
        case ANIM_GESTURE:
 
528
                s_controls.playerTorso = TORSO_GESTURE;
 
529
                break;
 
530
 
 
531
        case ANIM_DIE:
 
532
                s_controls.playerLegs = BOTH_DEATH1;
 
533
                s_controls.playerTorso = BOTH_DEATH1;
 
534
                s_controls.playerWeapon = WP_NONE;
 
535
                break;
 
536
 
 
537
        case ANIM_CHAT:
 
538
                s_controls.playerChat = qtrue;
 
539
                break;
 
540
 
 
541
        default:
 
542
                break;
 
543
        }
 
544
 
 
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 );
 
546
}
 
547
 
 
548
 
 
549
/*
 
550
=================
 
551
Controls_Update
 
552
=================
 
553
*/
 
554
static void Controls_Update( void ) {
 
555
        int             i;
 
556
        int             j;
 
557
        int             y;
 
558
        menucommon_s    **controls;
 
559
        menucommon_s    *control;
 
560
 
 
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);
 
567
                }
 
568
        }
 
569
 
 
570
        controls = g_controls[s_controls.section];
 
571
 
 
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);
 
576
        }
 
577
 
 
578
        // position controls
 
579
        y = ( SCREEN_HEIGHT - j * SMALLCHAR_HEIGHT ) / 2;
 
580
        // bk001204 - parentheses
 
581
        for( j = 0;     (control = controls[j]) ; j++, y += SMALLCHAR_HEIGHT ) {
 
582
                control->x      = 320;
 
583
                control->y      = y;
 
584
                control->left   = 320 - 19*SMALLCHAR_WIDTH;
 
585
                control->right  = 320 + 21*SMALLCHAR_WIDTH;
 
586
                control->top    = y;
 
587
                control->bottom = y + SMALLCHAR_HEIGHT;
 
588
        }
 
589
 
 
590
        if( s_controls.waitingforkey ) {
 
591
                // disable everybody
 
592
                for( i = 0; i < s_controls.menu.nitems; i++ ) {
 
593
                        ((menucommon_s*)(s_controls.menu.items[i]))->flags |= QMF_GRAYED;
 
594
                }
 
595
 
 
596
                // enable action item
 
597
                ((menucommon_s*)(s_controls.menu.items[s_controls.menu.cursor]))->flags &= ~QMF_GRAYED;
 
598
 
 
599
                // don't gray out player's name
 
600
                s_controls.name.generic.flags &= ~QMF_GRAYED;
 
601
 
 
602
                return;
 
603
        }
 
604
 
 
605
        // enable everybody
 
606
        for( i = 0; i < s_controls.menu.nitems; i++ ) {
 
607
                ((menucommon_s*)(s_controls.menu.items[i]))->flags &= ~QMF_GRAYED;
 
608
        }
 
609
 
 
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);
 
615
 
 
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;
 
620
 
 
621
        // set buttons
 
622
        switch( s_controls.section ) {
 
623
        case C_MOVEMENT:
 
624
                s_controls.movement.generic.flags &= ~QMF_PULSEIFFOCUS;
 
625
                s_controls.movement.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
 
626
                break;
 
627
        
 
628
        case C_LOOKING:
 
629
                s_controls.looking.generic.flags &= ~QMF_PULSEIFFOCUS;
 
630
                s_controls.looking.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
 
631
                break;
 
632
        
 
633
        case C_WEAPONS:
 
634
                s_controls.weapons.generic.flags &= ~QMF_PULSEIFFOCUS;
 
635
                s_controls.weapons.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
 
636
                break;          
 
637
 
 
638
        case C_MISC:
 
639
                s_controls.misc.generic.flags &= ~QMF_PULSEIFFOCUS;
 
640
                s_controls.misc.generic.flags |= (QMF_HIGHLIGHT|QMF_HIGHLIGHT_IF_FOCUS);
 
641
                break;
 
642
        }
 
643
}
 
644
 
 
645
 
 
646
/*
 
647
=================
 
648
Controls_DrawKeyBinding
 
649
=================
 
650
*/
 
651
static void Controls_DrawKeyBinding( void *self )
 
652
{
 
653
        menuaction_s*   a;
 
654
        int                             x;
 
655
        int                             y;
 
656
        int                             b1;
 
657
        int                             b2;
 
658
        qboolean                c;
 
659
        char                    name[32];
 
660
        char                    name2[32];
 
661
 
 
662
        a = (menuaction_s*) self;
 
663
 
 
664
        x =     a->generic.x;
 
665
        y = a->generic.y;
 
666
 
 
667
        c = (Menu_ItemAtCursor( a->generic.parent ) == a);
 
668
 
 
669
        b1 = g_bindings[a->generic.id].bind1;
 
670
        if (b1 == -1)
 
671
                strcpy(name,"???");
 
672
        else
 
673
        {
 
674
                trap_Key_KeynumToStringBuf( b1, name, 32 );
 
675
                Q_strupr(name);
 
676
 
 
677
                b2 = g_bindings[a->generic.id].bind2;
 
678
                if (b2 != -1)
 
679
                {
 
680
                        trap_Key_KeynumToStringBuf( b2, name2, 32 );
 
681
                        Q_strupr(name2);
 
682
 
 
683
                        strcat( name, " or " );
 
684
                        strcat( name, name2 );
 
685
                }
 
686
        }
 
687
 
 
688
        if (c)
 
689
        {
 
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 ); 
 
691
 
 
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 );
 
694
 
 
695
                if (s_controls.waitingforkey)
 
696
                {
 
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 );
 
699
                }
 
700
                else
 
701
                {
 
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 );
 
705
                }
 
706
        }
 
707
        else
 
708
        {
 
709
                if (a->generic.flags & QMF_GRAYED)
 
710
                {
 
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 );
 
713
                }
 
714
                else
 
715
                {
 
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 );
 
718
                }
 
719
        }
 
720
}
 
721
 
 
722
/*
 
723
=================
 
724
Controls_StatusBar
 
725
=================
 
726
*/
 
727
static void Controls_StatusBar( void *self )
 
728
{
 
729
        UI_DrawString(SCREEN_WIDTH * 0.50, SCREEN_HEIGHT * 0.80, "Use Arrow Keys or CLICK to change", UI_SMALLFONT|UI_CENTER, colorWhite );
 
730
}
 
731
 
 
732
 
 
733
/*
 
734
=================
 
735
Controls_DrawPlayer
 
736
=================
 
737
*/
 
738
static void Controls_DrawPlayer( void *self ) {
 
739
        menubitmap_s    *b;
 
740
        char                    buf[MAX_QPATH];
 
741
 
 
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 );
 
747
        }
 
748
 
 
749
        b = (menubitmap_s*) self;
 
750
        UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_controls.playerinfo, uis.realtime/2 );
 
751
}
 
752
 
 
753
 
 
754
/*
 
755
=================
 
756
Controls_GetKeyAssignment
 
757
=================
 
758
*/
 
759
static void Controls_GetKeyAssignment (char *command, int *twokeys)
 
760
{
 
761
        int             count;
 
762
        int             j;
 
763
        char    b[256];
 
764
 
 
765
        twokeys[0] = twokeys[1] = -1;
 
766
        count = 0;
 
767
 
 
768
        for ( j = 0; j < 256; j++ )
 
769
        {
 
770
                trap_Key_GetBindingBuf( j, b, 256 );
 
771
                if ( *b == 0 ) {
 
772
                        continue;
 
773
                }
 
774
                if ( !Q_stricmp( b, command ) ) {
 
775
                        twokeys[count] = j;
 
776
                        count++;
 
777
                        if (count == 2)
 
778
                                break;
 
779
                }
 
780
        }
 
781
}
 
782
 
 
783
/*
 
784
=================
 
785
Controls_GetConfig
 
786
=================
 
787
*/
 
788
static void Controls_GetConfig( void )
 
789
{
 
790
        int             i;
 
791
        int             twokeys[2];
 
792
        bind_t* bindptr;
 
793
 
 
794
        // put the bindings into a local store
 
795
        bindptr = g_bindings;
 
796
 
 
797
        // iterate each command, get its numeric binding
 
798
        for (i=0; ;i++,bindptr++)
 
799
        {
 
800
                if (!bindptr->label)
 
801
                        break;
 
802
 
 
803
                Controls_GetKeyAssignment(bindptr->command, twokeys);
 
804
 
 
805
                bindptr->bind1 = twokeys[0];
 
806
                bindptr->bind2 = twokeys[1];
 
807
        }
 
808
 
 
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" ) );
 
817
}
 
818
 
 
819
/*
 
820
=================
 
821
Controls_SetConfig
 
822
=================
 
823
*/
 
824
static void Controls_SetConfig( void )
 
825
{
 
826
        int             i;
 
827
        bind_t* bindptr;
 
828
 
 
829
        // set the bindings from the local store
 
830
        bindptr = g_bindings;
 
831
 
 
832
        // iterate each command, get its numeric binding
 
833
        for (i=0; ;i++,bindptr++)
 
834
        {
 
835
                if (!bindptr->label)
 
836
                        break;
 
837
 
 
838
                if (bindptr->bind1 != -1)
 
839
                {       
 
840
                        trap_Key_SetBinding( bindptr->bind1, bindptr->command );
 
841
 
 
842
                        if (bindptr->bind2 != -1)
 
843
                                trap_Key_SetBinding( bindptr->bind2, bindptr->command );
 
844
                }
 
845
        }
 
846
 
 
847
        if ( s_controls.invertmouse.curvalue )
 
848
                trap_Cvar_SetValue( "m_pitch", -fabs( trap_Cvar_VariableValue( "m_pitch" ) ) );
 
849
        else
 
850
                trap_Cvar_SetValue( "m_pitch", fabs( trap_Cvar_VariableValue( "m_pitch" ) ) );
 
851
 
 
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" );
 
860
}
 
861
 
 
862
/*
 
863
=================
 
864
Controls_SetDefaults
 
865
=================
 
866
*/
 
867
static void Controls_SetDefaults( void )
 
868
{
 
869
        int     i;
 
870
        bind_t* bindptr;
 
871
 
 
872
        // set the bindings from the local store
 
873
        bindptr = g_bindings;
 
874
 
 
875
        // iterate each command, set its default binding
 
876
        for (i=0; ;i++,bindptr++)
 
877
        {
 
878
                if (!bindptr->label)
 
879
                        break;
 
880
 
 
881
                bindptr->bind1 = bindptr->defaultbind1;
 
882
                bindptr->bind2 = bindptr->defaultbind2;
 
883
        }
 
884
 
 
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" );
 
893
}
 
894
 
 
895
/*
 
896
=================
 
897
Controls_MenuKey
 
898
=================
 
899
*/
 
900
static sfxHandle_t Controls_MenuKey( int key )
 
901
{
 
902
        int                     id;
 
903
        int                     i;
 
904
        qboolean        found;
 
905
        bind_t*         bindptr;
 
906
        found = qfalse;
 
907
 
 
908
        if (!s_controls.waitingforkey)
 
909
        {
 
910
                switch (key)
 
911
                {
 
912
                        case K_BACKSPACE:
 
913
                        case K_DEL:
 
914
                        case K_KP_DEL:
 
915
                                key = -1;
 
916
                                break;
 
917
                
 
918
                        case K_MOUSE2:
 
919
                        case K_ESCAPE:
 
920
                                if (s_controls.changesmade)
 
921
                                        Controls_SetConfig();
 
922
                                goto ignorekey; 
 
923
 
 
924
                        default:
 
925
                                goto ignorekey;
 
926
                }
 
927
        }
 
928
        else
 
929
        {
 
930
                if (key & K_CHAR_FLAG)
 
931
                        goto ignorekey;
 
932
 
 
933
                switch (key)
 
934
                {
 
935
                        case K_ESCAPE:
 
936
                                s_controls.waitingforkey = qfalse;
 
937
                                Controls_Update();
 
938
                                return (menu_out_sound);
 
939
        
 
940
                        case '`':
 
941
                                goto ignorekey;
 
942
                }
 
943
        }
 
944
 
 
945
        s_controls.changesmade = qtrue;
 
946
        
 
947
        if (key != -1)
 
948
        {
 
949
                // remove from any other bind
 
950
                bindptr = g_bindings;
 
951
                for (i=0; ;i++,bindptr++)
 
952
                {
 
953
                        if (!bindptr->label)    
 
954
                                break;
 
955
 
 
956
                        if (bindptr->bind2 == key)
 
957
                                bindptr->bind2 = -1;
 
958
 
 
959
                        if (bindptr->bind1 == key)
 
960
                        {
 
961
                                bindptr->bind1 = bindptr->bind2;        
 
962
                                bindptr->bind2 = -1;
 
963
                        }
 
964
                }
 
965
        }
 
966
 
 
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++)
 
971
        {
 
972
                if (!bindptr->label)    
 
973
                        break;
 
974
                
 
975
                if (bindptr->id == id)
 
976
                {
 
977
                        found = qtrue;
 
978
                        if (key == -1)
 
979
                        {
 
980
                                if( bindptr->bind1 != -1 ) {
 
981
                                        trap_Key_SetBinding( bindptr->bind1, "" );
 
982
                                        bindptr->bind1 = -1;
 
983
                                }
 
984
                                if( bindptr->bind2 != -1 ) {
 
985
                                        trap_Key_SetBinding( bindptr->bind2, "" );
 
986
                                        bindptr->bind2 = -1;
 
987
                                }
 
988
                        }
 
989
                        else if (bindptr->bind1 == -1) {
 
990
                                bindptr->bind1 = key;
 
991
                        }
 
992
                        else if (bindptr->bind1 != key && bindptr->bind2 == -1) {
 
993
                                bindptr->bind2 = key;
 
994
                        }
 
995
                        else
 
996
                        {
 
997
                                trap_Key_SetBinding( bindptr->bind1, "" );
 
998
                                trap_Key_SetBinding( bindptr->bind2, "" );
 
999
                                bindptr->bind1 = key;
 
1000
                                bindptr->bind2 = -1;
 
1001
                        }                                               
 
1002
                        break;
 
1003
                }
 
1004
        }                               
 
1005
                
 
1006
        s_controls.waitingforkey = qfalse;
 
1007
 
 
1008
        if (found)
 
1009
        {       
 
1010
                Controls_Update();
 
1011
                return (menu_out_sound);
 
1012
        }
 
1013
 
 
1014
ignorekey:
 
1015
        return Menu_DefaultKey( &s_controls.menu, key );
 
1016
}
 
1017
 
 
1018
/*
 
1019
=================
 
1020
Controls_ResetDefaults_Action
 
1021
=================
 
1022
*/
 
1023
static void Controls_ResetDefaults_Action( qboolean result ) {
 
1024
        if( !result ) {
 
1025
                return;
 
1026
        }
 
1027
 
 
1028
        s_controls.changesmade = qtrue;
 
1029
        Controls_SetDefaults();
 
1030
        Controls_Update();
 
1031
}
 
1032
 
 
1033
/*
 
1034
=================
 
1035
Controls_ResetDefaults_Draw
 
1036
=================
 
1037
*/
 
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 );
 
1041
}
 
1042
 
 
1043
/*
 
1044
=================
 
1045
Controls_MenuEvent
 
1046
=================
 
1047
*/
 
1048
static void Controls_MenuEvent( void* ptr, int event )
 
1049
{
 
1050
        switch (((menucommon_s*)ptr)->id)
 
1051
        {
 
1052
                case ID_MOVEMENT:
 
1053
                        if (event == QM_ACTIVATED)
 
1054
                        {
 
1055
                                s_controls.section = C_MOVEMENT; 
 
1056
                                Controls_Update();
 
1057
                        }
 
1058
                        break;
 
1059
 
 
1060
                case ID_LOOKING:
 
1061
                        if (event == QM_ACTIVATED)
 
1062
                        {
 
1063
                                s_controls.section = C_LOOKING; 
 
1064
                                Controls_Update();
 
1065
                        }
 
1066
                        break;
 
1067
 
 
1068
                case ID_WEAPONS:
 
1069
                        if (event == QM_ACTIVATED)
 
1070
                        {
 
1071
                                s_controls.section = C_WEAPONS; 
 
1072
                                Controls_Update();
 
1073
                        }
 
1074
                        break;
 
1075
 
 
1076
                case ID_MISC:
 
1077
                        if (event == QM_ACTIVATED)
 
1078
                        {
 
1079
                                s_controls.section = C_MISC; 
 
1080
                                Controls_Update();
 
1081
                        }
 
1082
                        break;
 
1083
 
 
1084
                case ID_DEFAULTS:
 
1085
                        if (event == QM_ACTIVATED)
 
1086
                        {
 
1087
                                UI_ConfirmMenu( "SET TO DEFAULTS?", Controls_ResetDefaults_Draw, Controls_ResetDefaults_Action );
 
1088
                        }
 
1089
                        break;
 
1090
 
 
1091
                case ID_BACK:
 
1092
                        if (event == QM_ACTIVATED)
 
1093
                        {
 
1094
                                if (s_controls.changesmade)
 
1095
                                        Controls_SetConfig();
 
1096
                                UI_PopMenu();
 
1097
                        }
 
1098
                        break;
 
1099
 
 
1100
                case ID_SAVEANDEXIT:
 
1101
                        if (event == QM_ACTIVATED)
 
1102
                        {
 
1103
                                Controls_SetConfig();
 
1104
                                UI_PopMenu();
 
1105
                        }
 
1106
                        break;
 
1107
 
 
1108
                case ID_EXIT:
 
1109
                        if (event == QM_ACTIVATED)
 
1110
                        {
 
1111
                                UI_PopMenu();
 
1112
                        }
 
1113
                        break;
 
1114
 
 
1115
                case ID_FREELOOK:
 
1116
                case ID_MOUSESPEED:
 
1117
                case ID_INVERTMOUSE:
 
1118
                case ID_SMOOTHMOUSE:
 
1119
                case ID_ALWAYSRUN:
 
1120
                case ID_AUTOSWITCH:
 
1121
                case ID_JOYENABLE:
 
1122
                case ID_JOYTHRESHOLD:
 
1123
                        if (event == QM_ACTIVATED)
 
1124
                        {
 
1125
                                s_controls.changesmade = qtrue;
 
1126
                        }
 
1127
                        break;          
 
1128
        }
 
1129
}
 
1130
 
 
1131
/*
 
1132
=================
 
1133
Controls_ActionEvent
 
1134
=================
 
1135
*/
 
1136
static void Controls_ActionEvent( void* ptr, int event )
 
1137
{
 
1138
        if (event == QM_LOSTFOCUS)
 
1139
        {
 
1140
                Controls_UpdateModel( ANIM_IDLE );
 
1141
        }
 
1142
        else if (event == QM_GOTFOCUS)
 
1143
        {
 
1144
                Controls_UpdateModel( g_bindings[((menucommon_s*)ptr)->id].anim );
 
1145
        }
 
1146
        else if ((event == QM_ACTIVATED) && !s_controls.waitingforkey)
 
1147
        {
 
1148
                s_controls.waitingforkey = 1;
 
1149
                Controls_Update();
 
1150
        }
 
1151
}
 
1152
 
 
1153
/*
 
1154
=================
 
1155
Controls_InitModel
 
1156
=================
 
1157
*/
 
1158
static void Controls_InitModel( void )
 
1159
{
 
1160
        memset( &s_controls.playerinfo, 0, sizeof(playerInfo_t) );
 
1161
 
 
1162
        UI_PlayerInfo_SetModel( &s_controls.playerinfo, UI_Cvar_VariableString( "model" ) );
 
1163
 
 
1164
        Controls_UpdateModel( ANIM_IDLE );
 
1165
}
 
1166
 
 
1167
/*
 
1168
=================
 
1169
Controls_InitWeapons
 
1170
=================
 
1171
*/
 
1172
static void Controls_InitWeapons( void ) {
 
1173
        gitem_t *       item;
 
1174
 
 
1175
        for ( item = bg_itemlist + 1 ; item->classname ; item++ ) {
 
1176
                if ( item->giType != IT_WEAPON ) {
 
1177
                        continue;
 
1178
                }
 
1179
                trap_R_RegisterModel( item->world_model[0] );
 
1180
        }
 
1181
}
 
1182
 
 
1183
/*
 
1184
=================
 
1185
Controls_MenuInit
 
1186
=================
 
1187
*/
 
1188
static void Controls_MenuInit( void )
 
1189
{
 
1190
        static char playername[32];
 
1191
 
 
1192
        // zero set all our globals
 
1193
        memset( &s_controls, 0 ,sizeof(controls_t) );
 
1194
 
 
1195
        Controls_Cache();
 
1196
 
 
1197
        s_controls.menu.key        = Controls_MenuKey;
 
1198
        s_controls.menu.wrapAround = qtrue;
 
1199
        s_controls.menu.fullscreen = qtrue;
 
1200
 
 
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;
 
1208
 
 
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;
 
1216
 
 
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;
 
1224
 
 
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;
 
1234
 
 
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;
 
1244
 
 
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;
 
1254
 
 
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;
 
1264
 
 
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;
 
1275
 
 
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;
 
1283
 
 
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;
 
1289
 
 
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;
 
1295
 
 
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;
 
1301
 
 
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;
 
1307
 
 
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;
 
1313
 
 
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;
 
1319
 
 
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;
 
1325
 
 
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;
 
1331
 
 
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;
 
1337
 
 
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;
 
1343
 
 
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;
 
1349
 
 
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;
 
1355
 
 
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;
 
1361
 
 
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;
 
1367
 
 
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;
 
1373
 
 
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;
 
1379
 
 
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;
 
1385
 
 
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;
 
1391
 
 
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;
 
1397
 
 
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;
 
1403
 
 
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;
 
1409
 
 
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;
 
1415
 
 
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;
 
1421
 
 
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;
 
1427
 
 
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;
 
1433
 
 
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;
 
1441
 
 
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;
 
1447
 
 
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;
 
1453
 
 
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;
 
1459
 
 
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;
 
1465
 
 
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;
 
1473
 
 
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;
 
1481
 
 
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;
 
1489
 
 
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;
 
1497
 
 
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;
 
1507
 
 
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;
 
1513
 
 
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;
 
1519
 
 
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;
 
1525
 
 
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;
 
1531
 
 
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;
 
1537
 
 
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;
 
1545
 
 
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;
 
1555
 
 
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;
 
1563
 
 
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 );
 
1569
 
 
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 );
 
1574
 
 
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 );
 
1586
 
 
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 );
 
1598
 
 
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 );
 
1612
 
 
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 );
 
1620
 
 
1621
        Menu_AddItem( &s_controls.menu, &s_controls.back );
 
1622
 
 
1623
        trap_Cvar_VariableStringBuffer( "name", s_controls.name.string, 16 );
 
1624
        Q_CleanStr( s_controls.name.string );
 
1625
 
 
1626
        // initialize the configurable cvars
 
1627
        Controls_InitCvars();
 
1628
 
 
1629
        // initialize the current config
 
1630
        Controls_GetConfig();
 
1631
 
 
1632
        // intialize the model
 
1633
        Controls_InitModel();
 
1634
 
 
1635
        // intialize the weapons
 
1636
        Controls_InitWeapons ();
 
1637
 
 
1638
        // initial default section
 
1639
        s_controls.section = C_LOOKING;
 
1640
 
 
1641
        // update the ui
 
1642
        Controls_Update();
 
1643
}
 
1644
 
 
1645
 
 
1646
/*
 
1647
=================
 
1648
Controls_Cache
 
1649
=================
 
1650
*/
 
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 );
 
1656
}
 
1657
 
 
1658
 
 
1659
/*
 
1660
=================
 
1661
UI_ControlsMenu
 
1662
=================
 
1663
*/
 
1664
void UI_ControlsMenu( void ) {
 
1665
        Controls_MenuInit();
 
1666
        UI_PushMenu( &s_controls.menu );
 
1667
}