~ubuntu-branches/ubuntu/jaunty/openarena/jaunty

« back to all changes in this revision

Viewing changes to code/cgame/cg_main.orig.c

  • Committer: Bazaar Package Importer
  • Author(s): Bruno "Fuddl" Kleinert, Bruno "Fuddl" Kleinert
  • Date: 2008-04-24 14:33:54 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20080424143354-0cuxsalv98ajw2js
Tags: 0.7.6-1
[ Bruno "Fuddl" Kleinert ]
* New upstream release
* Freshen 10_fix_build_and_binary_on_alpha.dpatch to apply to latest
  upstream sources
* Remove 10-fix_menudef.h_includes.dpatch which pulled in a missing header
  file. The header is now included in the upstream tarball.
* Remove debian/watch, because upstream places its new releases too often to
  different download locations
* Updated debian/copyright to reflect the download location
* Expand copyright years in debian/copyright

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
// cg_main.c -- initialization and primary entry point for cgame
 
24
#include "cg_local.h"
 
25
 
 
26
#ifdef MISSIONPACK
 
27
#include "../ui/ui_shared.h"
 
28
// display context for new ui stuff
 
29
displayContextDef_t cgDC;
 
30
#endif
 
31
 
 
32
int forceModelModificationCount = -1;
 
33
 
 
34
void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum );
 
35
void CG_Shutdown( void );
 
36
 
 
37
 
 
38
/*
 
39
================
 
40
vmMain
 
41
 
 
42
This is the only way control passes into the module.
 
43
This must be the very first function compiled into the .q3vm file
 
44
================
 
45
*/
 
46
intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8, int arg9, int arg10, int arg11  ) {
 
47
 
 
48
        switch ( command ) {
 
49
        case CG_INIT:
 
50
                CG_Init( arg0, arg1, arg2 );
 
51
                return 0;
 
52
        case CG_SHUTDOWN:
 
53
                CG_Shutdown();
 
54
                return 0;
 
55
        case CG_CONSOLE_COMMAND:
 
56
                return CG_ConsoleCommand();
 
57
        case CG_DRAW_ACTIVE_FRAME:
 
58
                CG_DrawActiveFrame( arg0, arg1, arg2 );
 
59
                return 0;
 
60
        case CG_CROSSHAIR_PLAYER:
 
61
                return CG_CrosshairPlayer();
 
62
        case CG_LAST_ATTACKER:
 
63
                return CG_LastAttacker();
 
64
        case CG_KEY_EVENT:
 
65
                CG_KeyEvent(arg0, arg1);
 
66
                return 0;
 
67
        case CG_MOUSE_EVENT:
 
68
#ifdef MISSIONPACK
 
69
                cgDC.cursorx = cgs.cursorX;
 
70
                cgDC.cursory = cgs.cursorY;
 
71
#endif
 
72
                CG_MouseEvent(arg0, arg1);
 
73
                return 0;
 
74
        case CG_EVENT_HANDLING:
 
75
                CG_EventHandling(arg0);
 
76
                return 0;
 
77
        default:
 
78
                CG_Error( "vmMain: unknown command %i", command );
 
79
                break;
 
80
        }
 
81
        return -1;
 
82
}
 
83
 
 
84
 
 
85
cg_t                            cg;
 
86
cgs_t                           cgs;
 
87
centity_t                       cg_entities[MAX_GENTITIES];
 
88
weaponInfo_t            cg_weapons[MAX_WEAPONS];
 
89
itemInfo_t                      cg_items[MAX_ITEMS];
 
90
 
 
91
 
 
92
vmCvar_t        cg_railTrailTime;
 
93
vmCvar_t        cg_centertime;
 
94
vmCvar_t        cg_runpitch;
 
95
vmCvar_t        cg_runroll;
 
96
vmCvar_t        cg_bobup;
 
97
vmCvar_t        cg_bobpitch;
 
98
vmCvar_t        cg_bobroll;
 
99
vmCvar_t        cg_swingSpeed;
 
100
vmCvar_t        cg_shadows;
 
101
vmCvar_t        cg_gibs;
 
102
vmCvar_t        cg_drawTimer;
 
103
vmCvar_t        cg_drawFPS;
 
104
vmCvar_t        cg_drawSnapshot;
 
105
vmCvar_t        cg_draw3dIcons;
 
106
vmCvar_t        cg_drawIcons;
 
107
vmCvar_t        cg_drawAmmoWarning;
 
108
vmCvar_t        cg_drawCrosshair;
 
109
vmCvar_t        cg_drawCrosshairNames;
 
110
vmCvar_t        cg_drawRewards;
 
111
vmCvar_t        cg_crosshairSize;
 
112
vmCvar_t        cg_crosshairX;
 
113
vmCvar_t        cg_crosshairY;
 
114
vmCvar_t        cg_crosshairHealth;
 
115
vmCvar_t        cg_draw2D;
 
116
vmCvar_t        cg_drawStatus;
 
117
vmCvar_t        cg_animSpeed;
 
118
vmCvar_t        cg_debugAnim;
 
119
vmCvar_t        cg_debugPosition;
 
120
vmCvar_t        cg_debugEvents;
 
121
vmCvar_t        cg_errorDecay;
 
122
vmCvar_t        cg_nopredict;
 
123
vmCvar_t        cg_noPlayerAnims;
 
124
vmCvar_t        cg_showmiss;
 
125
vmCvar_t        cg_footsteps;
 
126
vmCvar_t        cg_addMarks;
 
127
vmCvar_t        cg_brassTime;
 
128
vmCvar_t        cg_viewsize;
 
129
vmCvar_t        cg_drawGun;
 
130
vmCvar_t        cg_gun_frame;
 
131
vmCvar_t        cg_gun_x;
 
132
vmCvar_t        cg_gun_y;
 
133
vmCvar_t        cg_gun_z;
 
134
vmCvar_t        cg_tracerChance;
 
135
vmCvar_t        cg_tracerWidth;
 
136
vmCvar_t        cg_tracerLength;
 
137
vmCvar_t        cg_autoswitch;
 
138
vmCvar_t        cg_ignore;
 
139
vmCvar_t        cg_simpleItems;
 
140
vmCvar_t        cg_fov;
 
141
vmCvar_t        cg_zoomFov;
 
142
vmCvar_t        cg_thirdPerson;
 
143
vmCvar_t        cg_thirdPersonRange;
 
144
vmCvar_t        cg_thirdPersonAngle;
 
145
vmCvar_t        cg_stereoSeparation;
 
146
vmCvar_t        cg_lagometer;
 
147
vmCvar_t        cg_drawAttacker;
 
148
vmCvar_t        cg_synchronousClients;
 
149
vmCvar_t        cg_teamChatTime;
 
150
vmCvar_t        cg_teamChatHeight;
 
151
vmCvar_t        cg_stats;
 
152
vmCvar_t        cg_buildScript;
 
153
vmCvar_t        cg_forceModel;
 
154
vmCvar_t        cg_paused;
 
155
vmCvar_t        cg_blood;
 
156
vmCvar_t        cg_predictItems;
 
157
vmCvar_t        cg_deferPlayers;
 
158
vmCvar_t        cg_drawTeamOverlay;
 
159
vmCvar_t        cg_teamOverlayUserinfo;
 
160
vmCvar_t        cg_drawFriend;
 
161
vmCvar_t        cg_teamChatsOnly;
 
162
vmCvar_t        cg_noVoiceChats;
 
163
vmCvar_t        cg_noVoiceText;
 
164
vmCvar_t        cg_hudFiles;
 
165
vmCvar_t        cg_scorePlum;
 
166
vmCvar_t        cg_smoothClients;
 
167
vmCvar_t        pmove_fixed;
 
168
//vmCvar_t      cg_pmove_fixed;
 
169
vmCvar_t        pmove_msec;
 
170
vmCvar_t        cg_pmove_msec;
 
171
vmCvar_t        cg_cameraMode;
 
172
vmCvar_t        cg_cameraOrbit;
 
173
vmCvar_t        cg_cameraOrbitDelay;
 
174
vmCvar_t        cg_timescaleFadeEnd;
 
175
vmCvar_t        cg_timescaleFadeSpeed;
 
176
vmCvar_t        cg_timescale;
 
177
vmCvar_t        cg_smallFont;
 
178
vmCvar_t        cg_bigFont;
 
179
vmCvar_t        cg_noTaunt;
 
180
vmCvar_t        cg_noProjectileTrail;
 
181
vmCvar_t        cg_oldRail;
 
182
vmCvar_t        cg_oldRocket;
 
183
vmCvar_t        cg_oldPlasma;
 
184
vmCvar_t        cg_trueLightning;
 
185
 
 
186
 
 
187
#ifdef MISSIONPACK
 
188
vmCvar_t        cg_redTeamName;
 
189
vmCvar_t        cg_blueTeamName;
 
190
vmCvar_t        cg_currentSelectedPlayer;
 
191
vmCvar_t        cg_currentSelectedPlayerName;
 
192
vmCvar_t        cg_singlePlayer;
 
193
vmCvar_t        cg_enableDust;
 
194
vmCvar_t        cg_enableBreath;
 
195
vmCvar_t        cg_singlePlayerActive;
 
196
vmCvar_t        cg_recordSPDemo;
 
197
vmCvar_t        cg_recordSPDemoName;
 
198
vmCvar_t        cg_obeliskRespawnDelay;
 
199
#endif
 
200
 
 
201
typedef struct {
 
202
        vmCvar_t        *vmCvar;
 
203
        char            *cvarName;
 
204
        char            *defaultString;
 
205
        int                     cvarFlags;
 
206
} cvarTable_t;
 
207
 
 
208
static cvarTable_t cvarTable[] = { // bk001129
 
209
        { &cg_ignore, "cg_ignore", "0", 0 },    // used for debugging
 
210
        { &cg_autoswitch, "cg_autoswitch", "1", CVAR_ARCHIVE },
 
211
        { &cg_drawGun, "cg_drawGun", "1", CVAR_ARCHIVE },
 
212
        { &cg_zoomFov, "cg_zoomfov", "22.5", CVAR_ARCHIVE },
 
213
        { &cg_fov, "cg_fov", "90", CVAR_ARCHIVE },
 
214
        { &cg_viewsize, "cg_viewsize", "100", CVAR_ARCHIVE },
 
215
        { &cg_stereoSeparation, "cg_stereoSeparation", "0.4", CVAR_ARCHIVE  },
 
216
        { &cg_shadows, "cg_shadows", "1", CVAR_ARCHIVE  },
 
217
        { &cg_gibs, "cg_gibs", "1", CVAR_ARCHIVE  },
 
218
        { &cg_draw2D, "cg_draw2D", "1", CVAR_ARCHIVE  },
 
219
        { &cg_drawStatus, "cg_drawStatus", "1", CVAR_ARCHIVE  },
 
220
        { &cg_drawTimer, "cg_drawTimer", "0", CVAR_ARCHIVE  },
 
221
        { &cg_drawFPS, "cg_drawFPS", "0", CVAR_ARCHIVE  },
 
222
        { &cg_drawSnapshot, "cg_drawSnapshot", "0", CVAR_ARCHIVE  },
 
223
        { &cg_draw3dIcons, "cg_draw3dIcons", "1", CVAR_ARCHIVE  },
 
224
        { &cg_drawIcons, "cg_drawIcons", "1", CVAR_ARCHIVE  },
 
225
        { &cg_drawAmmoWarning, "cg_drawAmmoWarning", "1", CVAR_ARCHIVE  },
 
226
        { &cg_drawAttacker, "cg_drawAttacker", "1", CVAR_ARCHIVE  },
 
227
        { &cg_drawCrosshair, "cg_drawCrosshair", "4", CVAR_ARCHIVE },
 
228
        { &cg_drawCrosshairNames, "cg_drawCrosshairNames", "1", CVAR_ARCHIVE },
 
229
        { &cg_drawRewards, "cg_drawRewards", "1", CVAR_ARCHIVE },
 
230
        { &cg_crosshairSize, "cg_crosshairSize", "24", CVAR_ARCHIVE },
 
231
        { &cg_crosshairHealth, "cg_crosshairHealth", "1", CVAR_ARCHIVE },
 
232
        { &cg_crosshairX, "cg_crosshairX", "0", CVAR_ARCHIVE },
 
233
        { &cg_crosshairY, "cg_crosshairY", "0", CVAR_ARCHIVE },
 
234
        { &cg_brassTime, "cg_brassTime", "2500", CVAR_ARCHIVE },
 
235
        { &cg_simpleItems, "cg_simpleItems", "0", CVAR_ARCHIVE },
 
236
        { &cg_addMarks, "cg_marks", "1", CVAR_ARCHIVE },
 
237
        { &cg_lagometer, "cg_lagometer", "1", CVAR_ARCHIVE },
 
238
        { &cg_railTrailTime, "cg_railTrailTime", "400", CVAR_ARCHIVE  },
 
239
        { &cg_gun_x, "cg_gunX", "0", CVAR_CHEAT },
 
240
        { &cg_gun_y, "cg_gunY", "0", CVAR_CHEAT },
 
241
        { &cg_gun_z, "cg_gunZ", "0", CVAR_CHEAT },
 
242
        { &cg_centertime, "cg_centertime", "3", CVAR_CHEAT },
 
243
        { &cg_runpitch, "cg_runpitch", "0.002", CVAR_ARCHIVE},
 
244
        { &cg_runroll, "cg_runroll", "0.005", CVAR_ARCHIVE },
 
245
        { &cg_bobup , "cg_bobup", "0.005", CVAR_CHEAT },
 
246
        { &cg_bobpitch, "cg_bobpitch", "0.002", CVAR_ARCHIVE },
 
247
        { &cg_bobroll, "cg_bobroll", "0.002", CVAR_ARCHIVE },
 
248
        { &cg_swingSpeed, "cg_swingSpeed", "0.3", CVAR_CHEAT },
 
249
        { &cg_animSpeed, "cg_animspeed", "1", CVAR_CHEAT },
 
250
        { &cg_debugAnim, "cg_debuganim", "0", CVAR_CHEAT },
 
251
        { &cg_debugPosition, "cg_debugposition", "0", CVAR_CHEAT },
 
252
        { &cg_debugEvents, "cg_debugevents", "0", CVAR_CHEAT },
 
253
        { &cg_errorDecay, "cg_errordecay", "100", 0 },
 
254
        { &cg_nopredict, "cg_nopredict", "0", 0 },
 
255
        { &cg_noPlayerAnims, "cg_noplayeranims", "0", CVAR_CHEAT },
 
256
        { &cg_showmiss, "cg_showmiss", "0", 0 },
 
257
        { &cg_footsteps, "cg_footsteps", "1", CVAR_CHEAT },
 
258
        { &cg_tracerChance, "cg_tracerchance", "0.4", CVAR_CHEAT },
 
259
        { &cg_tracerWidth, "cg_tracerwidth", "1", CVAR_CHEAT },
 
260
        { &cg_tracerLength, "cg_tracerlength", "100", CVAR_CHEAT },
 
261
        { &cg_thirdPersonRange, "cg_thirdPersonRange", "40", CVAR_CHEAT },
 
262
        { &cg_thirdPersonAngle, "cg_thirdPersonAngle", "0", CVAR_CHEAT },
 
263
        { &cg_thirdPerson, "cg_thirdPerson", "0", 0 },
 
264
        { &cg_teamChatTime, "cg_teamChatTime", "3000", CVAR_ARCHIVE  },
 
265
        { &cg_teamChatHeight, "cg_teamChatHeight", "0", CVAR_ARCHIVE  },
 
266
        { &cg_forceModel, "cg_forceModel", "0", CVAR_ARCHIVE  },
 
267
        { &cg_predictItems, "cg_predictItems", "1", CVAR_ARCHIVE },
 
268
#ifdef MISSIONPACK
 
269
        { &cg_deferPlayers, "cg_deferPlayers", "0", CVAR_ARCHIVE },
 
270
#else
 
271
        { &cg_deferPlayers, "cg_deferPlayers", "1", CVAR_ARCHIVE },
 
272
#endif
 
273
        { &cg_drawTeamOverlay, "cg_drawTeamOverlay", "0", CVAR_ARCHIVE },
 
274
        { &cg_teamOverlayUserinfo, "teamoverlay", "0", CVAR_ROM | CVAR_USERINFO },
 
275
        { &cg_stats, "cg_stats", "0", 0 },
 
276
        { &cg_drawFriend, "cg_drawFriend", "1", CVAR_ARCHIVE },
 
277
        { &cg_teamChatsOnly, "cg_teamChatsOnly", "0", CVAR_ARCHIVE },
 
278
        { &cg_noVoiceChats, "cg_noVoiceChats", "0", CVAR_ARCHIVE },
 
279
        { &cg_noVoiceText, "cg_noVoiceText", "0", CVAR_ARCHIVE },
 
280
        // the following variables are created in other parts of the system,
 
281
        // but we also reference them here
 
282
        { &cg_buildScript, "com_buildScript", "0", 0 }, // force loading of all possible data amd error on failures
 
283
        { &cg_paused, "cl_paused", "0", CVAR_ROM },
 
284
        { &cg_blood, "com_blood", "1", CVAR_ARCHIVE },
 
285
        { &cg_synchronousClients, "g_synchronousClients", "0", 0 },     // communicated by systeminfo
 
286
//Now for elimination stuff:
 
287
        { &cg_elimination_selfdamage, "elimination_selfdamage", "0", CVAR_ARCHIVE },
 
288
        { &cg_elimination_startHealth, "elimination_startHealth", "200", CVAR_ARCHIVE },
 
289
        { &cg_elimination_startArmor, "elimination_startArmor", "200", CVAR_ARCHIVE },
 
290
        { &cg_elimination_bfg, "elimination_bfg", "0", CVAR_ARCHIVE },
 
291
        { &cg_elimination_roundtime, "elimination_roundtime", "120", CVAR_ARCHIVE },
 
292
        { &cg_elimination_warmup, "elimination_warmup", "5", CVAR_ARCHIVE },
 
293
#ifdef MISSIONPACK
 
294
        { &cg_redTeamName, "g_redteam", DEFAULT_REDTEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO },
 
295
        { &cg_blueTeamName, "g_blueteam", DEFAULT_BLUETEAM_NAME, CVAR_ARCHIVE | CVAR_SERVERINFO | CVAR_USERINFO },
 
296
        { &cg_currentSelectedPlayer, "cg_currentSelectedPlayer", "0", CVAR_ARCHIVE},
 
297
        { &cg_currentSelectedPlayerName, "cg_currentSelectedPlayerName", "", CVAR_ARCHIVE},
 
298
        { &cg_singlePlayer, "ui_singlePlayerActive", "0", CVAR_USERINFO},
 
299
        { &cg_enableDust, "g_enableDust", "0", CVAR_SERVERINFO},
 
300
        { &cg_enableBreath, "g_enableBreath", "0", CVAR_SERVERINFO},
 
301
        { &cg_singlePlayerActive, "ui_singlePlayerActive", "0", CVAR_USERINFO},
 
302
        { &cg_recordSPDemo, "ui_recordSPDemo", "0", CVAR_ARCHIVE},
 
303
        { &cg_recordSPDemoName, "ui_recordSPDemoName", "", CVAR_ARCHIVE},
 
304
        { &cg_obeliskRespawnDelay, "g_obeliskRespawnDelay", "10", CVAR_SERVERINFO},
 
305
        { &cg_hudFiles, "cg_hudFiles", "ui/hud.txt", CVAR_ARCHIVE},
 
306
#endif
 
307
        { &cg_cameraOrbit, "cg_cameraOrbit", "0", CVAR_CHEAT},
 
308
        { &cg_cameraOrbitDelay, "cg_cameraOrbitDelay", "50", CVAR_ARCHIVE},
 
309
        { &cg_timescaleFadeEnd, "cg_timescaleFadeEnd", "1", 0},
 
310
        { &cg_timescaleFadeSpeed, "cg_timescaleFadeSpeed", "0", 0},
 
311
        { &cg_timescale, "timescale", "1", 0},
 
312
        { &cg_scorePlum, "cg_scorePlums", "1", CVAR_USERINFO | CVAR_ARCHIVE},
 
313
        { &cg_smoothClients, "cg_smoothClients", "0", CVAR_USERINFO | CVAR_ARCHIVE},
 
314
        { &cg_cameraMode, "com_cameraMode", "0", CVAR_CHEAT},
 
315
 
 
316
        { &pmove_fixed, "pmove_fixed", "0", 0},
 
317
        { &pmove_msec, "pmove_msec", "8", 0},
 
318
        { &cg_noTaunt, "cg_noTaunt", "0", CVAR_ARCHIVE},
 
319
        { &cg_noProjectileTrail, "cg_noProjectileTrail", "0", CVAR_ARCHIVE},
 
320
        { &cg_smallFont, "ui_smallFont", "0.25", CVAR_ARCHIVE},
 
321
        { &cg_bigFont, "ui_bigFont", "0.4", CVAR_ARCHIVE},
 
322
        { &cg_oldRail, "cg_oldRail", "1", CVAR_ARCHIVE},
 
323
        { &cg_oldRocket, "cg_oldRocket", "1", CVAR_ARCHIVE},
 
324
        { &cg_oldPlasma, "cg_oldPlasma", "1", CVAR_ARCHIVE},
 
325
        { &cg_trueLightning, "cg_trueLightning", "0.0", CVAR_ARCHIVE}
 
326
//      { &cg_pmove_fixed, "cg_pmove_fixed", "0", CVAR_USERINFO | CVAR_ARCHIVE }
 
327
};
 
328
 
 
329
static int  cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] );
 
330
 
 
331
/*
 
332
=================
 
333
CG_RegisterCvars
 
334
=================
 
335
*/
 
336
void CG_RegisterCvars( void ) {
 
337
        int                     i;
 
338
        cvarTable_t     *cv;
 
339
        char            var[MAX_TOKEN_CHARS];
 
340
 
 
341
        for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) {
 
342
                trap_Cvar_Register( cv->vmCvar, cv->cvarName,
 
343
                        cv->defaultString, cv->cvarFlags );
 
344
        }
 
345
 
 
346
        // see if we are also running the server on this machine
 
347
        trap_Cvar_VariableStringBuffer( "sv_running", var, sizeof( var ) );
 
348
        cgs.localServer = atoi( var );
 
349
 
 
350
        forceModelModificationCount = cg_forceModel.modificationCount;
 
351
 
 
352
        trap_Cvar_Register(NULL, "model", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE );
 
353
        trap_Cvar_Register(NULL, "headmodel", DEFAULT_MODEL, CVAR_USERINFO | CVAR_ARCHIVE );
 
354
        trap_Cvar_Register(NULL, "team_model", DEFAULT_TEAM_MODEL, CVAR_USERINFO | CVAR_ARCHIVE );
 
355
        trap_Cvar_Register(NULL, "team_headmodel", DEFAULT_TEAM_HEAD, CVAR_USERINFO | CVAR_ARCHIVE );
 
356
}
 
357
 
 
358
/*                                                                                                                                                                                                                                                                                      
 
359
===================
 
360
CG_ForceModelChange
 
361
===================
 
362
*/
 
363
static void CG_ForceModelChange( void ) {
 
364
        int             i;
 
365
 
 
366
        for (i=0 ; i<MAX_CLIENTS ; i++) {
 
367
                const char              *clientInfo;
 
368
 
 
369
                clientInfo = CG_ConfigString( CS_PLAYERS+i );
 
370
                if ( !clientInfo[0] ) {
 
371
                        continue;
 
372
                }
 
373
                CG_NewClientInfo( i );
 
374
        }
 
375
}
 
376
 
 
377
/*
 
378
=================
 
379
CG_UpdateCvars
 
380
=================
 
381
*/
 
382
void CG_UpdateCvars( void ) {
 
383
        int                     i;
 
384
        cvarTable_t     *cv;
 
385
 
 
386
        for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) {
 
387
                trap_Cvar_Update( cv->vmCvar );
 
388
        }
 
389
 
 
390
        // check for modications here
 
391
 
 
392
        // If team overlay is on, ask for updates from the server.  If its off,
 
393
        // let the server know so we don't receive it
 
394
        if ( drawTeamOverlayModificationCount != cg_drawTeamOverlay.modificationCount ) {
 
395
                drawTeamOverlayModificationCount = cg_drawTeamOverlay.modificationCount;
 
396
 
 
397
                if ( cg_drawTeamOverlay.integer > 0 ) {
 
398
                        trap_Cvar_Set( "teamoverlay", "1" );
 
399
                } else {
 
400
                        trap_Cvar_Set( "teamoverlay", "0" );
 
401
                }
 
402
        }
 
403
 
 
404
        // if force model changed
 
405
        if ( forceModelModificationCount != cg_forceModel.modificationCount ) {
 
406
                forceModelModificationCount = cg_forceModel.modificationCount;
 
407
                CG_ForceModelChange();
 
408
        }
 
409
}
 
410
 
 
411
int CG_CrosshairPlayer( void ) {
 
412
        if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) {
 
413
                return -1;
 
414
        }
 
415
        return cg.crosshairClientNum;
 
416
}
 
417
 
 
418
int CG_LastAttacker( void ) {
 
419
        if ( !cg.attackerTime ) {
 
420
                return -1;
 
421
        }
 
422
        return cg.snap->ps.persistant[PERS_ATTACKER];
 
423
}
 
424
 
 
425
void QDECL CG_Printf( const char *msg, ... ) {
 
426
        va_list         argptr;
 
427
        char            text[1024];
 
428
 
 
429
        va_start (argptr, msg);
 
430
        vsprintf (text, msg, argptr);
 
431
        va_end (argptr);
 
432
 
 
433
        trap_Print( text );
 
434
}
 
435
 
 
436
void QDECL CG_Error( const char *msg, ... ) {
 
437
        va_list         argptr;
 
438
        char            text[1024];
 
439
 
 
440
        va_start (argptr, msg);
 
441
        vsprintf (text, msg, argptr);
 
442
        va_end (argptr);
 
443
 
 
444
        trap_Error( text );
 
445
}
 
446
 
 
447
void QDECL Com_Error( int level, const char *error, ... ) {
 
448
        va_list         argptr;
 
449
        char            text[1024];
 
450
 
 
451
        va_start (argptr, error);
 
452
        vsprintf (text, error, argptr);
 
453
        va_end (argptr);
 
454
 
 
455
        CG_Error( "%s", text);
 
456
}
 
457
 
 
458
void QDECL Com_Printf( const char *msg, ... ) {
 
459
        va_list         argptr;
 
460
        char            text[1024];
 
461
 
 
462
        va_start (argptr, msg);
 
463
        vsprintf (text, msg, argptr);
 
464
        va_end (argptr);
 
465
 
 
466
        CG_Printf ("%s", text);
 
467
}
 
468
 
 
469
/*
 
470
================
 
471
CG_Argv
 
472
================
 
473
*/
 
474
const char *CG_Argv( int arg ) {
 
475
        static char     buffer[MAX_STRING_CHARS];
 
476
 
 
477
        trap_Argv( arg, buffer, sizeof( buffer ) );
 
478
 
 
479
        return buffer;
 
480
}
 
481
 
 
482
 
 
483
//========================================================================
 
484
 
 
485
/*
 
486
=================
 
487
CG_RegisterItemSounds
 
488
 
 
489
The server says this item is used on this level
 
490
=================
 
491
*/
 
492
static void CG_RegisterItemSounds( int itemNum ) {
 
493
        gitem_t                 *item;
 
494
        char                    data[MAX_QPATH];
 
495
        char                    *s, *start;
 
496
        int                             len;
 
497
 
 
498
        item = &bg_itemlist[ itemNum ];
 
499
 
 
500
        if( item->pickup_sound ) {
 
501
                trap_S_RegisterSound( item->pickup_sound, qfalse );
 
502
        }
 
503
 
 
504
        // parse the space seperated precache string for other media
 
505
        s = item->sounds;
 
506
        if (!s || !s[0])
 
507
                return;
 
508
 
 
509
        while (*s) {
 
510
                start = s;
 
511
                while (*s && *s != ' ') {
 
512
                        s++;
 
513
                }
 
514
 
 
515
                len = s-start;
 
516
                if (len >= MAX_QPATH || len < 5) {
 
517
                        CG_Error( "PrecacheItem: %s has bad precache string", 
 
518
                                item->classname);
 
519
                        return;
 
520
                }
 
521
                memcpy (data, start, len);
 
522
                data[len] = 0;
 
523
                if ( *s ) {
 
524
                        s++;
 
525
                }
 
526
 
 
527
                if ( !strcmp(data+len-3, "wav" )) {
 
528
                        trap_S_RegisterSound( data, qfalse );
 
529
                }
 
530
        }
 
531
}
 
532
 
 
533
 
 
534
/*
 
535
=================
 
536
CG_RegisterSounds
 
537
 
 
538
called during a precache command
 
539
=================
 
540
*/
 
541
static void CG_RegisterSounds( void ) {
 
542
        int             i;
 
543
        char    items[MAX_ITEMS+1];
 
544
        char    name[MAX_QPATH];
 
545
        const char      *soundName;
 
546
 
 
547
        // voice commands
 
548
#ifdef MISSIONPACK
 
549
        CG_LoadVoiceChats();
 
550
#endif
 
551
 
 
552
        cgs.media.oneMinuteSound = trap_S_RegisterSound( "sound/feedback/1_minute.wav", qtrue );
 
553
        cgs.media.fiveMinuteSound = trap_S_RegisterSound( "sound/feedback/5_minute.wav", qtrue );
 
554
        cgs.media.suddenDeathSound = trap_S_RegisterSound( "sound/feedback/sudden_death.wav", qtrue );
 
555
        cgs.media.oneFragSound = trap_S_RegisterSound( "sound/feedback/1_frag.wav", qtrue );
 
556
        cgs.media.twoFragSound = trap_S_RegisterSound( "sound/feedback/2_frags.wav", qtrue );
 
557
        cgs.media.threeFragSound = trap_S_RegisterSound( "sound/feedback/3_frags.wav", qtrue );
 
558
        cgs.media.count3Sound = trap_S_RegisterSound( "sound/feedback/three.wav", qtrue );
 
559
        cgs.media.count2Sound = trap_S_RegisterSound( "sound/feedback/two.wav", qtrue );
 
560
        cgs.media.count1Sound = trap_S_RegisterSound( "sound/feedback/one.wav", qtrue );
 
561
        cgs.media.countFightSound = trap_S_RegisterSound( "sound/feedback/fight.wav", qtrue );
 
562
        cgs.media.countPrepareSound = trap_S_RegisterSound( "sound/feedback/prepare.wav", qtrue );
 
563
#ifdef MISSIONPACK
 
564
        cgs.media.countPrepareTeamSound = trap_S_RegisterSound( "sound/feedback/prepare_team.wav", qtrue );
 
565
#endif
 
566
 
 
567
        if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) {
 
568
 
 
569
                cgs.media.captureAwardSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_yourteam.wav", qtrue );
 
570
                cgs.media.redLeadsSound = trap_S_RegisterSound( "sound/feedback/redleads.wav", qtrue );
 
571
                cgs.media.blueLeadsSound = trap_S_RegisterSound( "sound/feedback/blueleads.wav", qtrue );
 
572
                cgs.media.teamsTiedSound = trap_S_RegisterSound( "sound/feedback/teamstied.wav", qtrue );
 
573
                cgs.media.hitTeamSound = trap_S_RegisterSound( "sound/feedback/hit_teammate.wav", qtrue );
 
574
 
 
575
                cgs.media.redScoredSound = trap_S_RegisterSound( "sound/teamplay/voc_red_scores.wav", qtrue );
 
576
                cgs.media.blueScoredSound = trap_S_RegisterSound( "sound/teamplay/voc_blue_scores.wav", qtrue );
 
577
 
 
578
                cgs.media.captureYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_yourteam.wav", qtrue );
 
579
                cgs.media.captureOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagcapture_opponent.wav", qtrue );
 
580
 
 
581
                cgs.media.returnYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_yourteam.wav", qtrue );
 
582
                cgs.media.returnOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue );
 
583
 
 
584
                cgs.media.takenYourTeamSound = trap_S_RegisterSound( "sound/teamplay/flagtaken_yourteam.wav", qtrue );
 
585
                cgs.media.takenOpponentSound = trap_S_RegisterSound( "sound/teamplay/flagtaken_opponent.wav", qtrue );
 
586
 
 
587
                if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) {
 
588
                        cgs.media.redFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/voc_red_returned.wav", qtrue );
 
589
                        cgs.media.blueFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/voc_blue_returned.wav", qtrue );
 
590
                        cgs.media.enemyTookYourFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_flag.wav", qtrue );
 
591
                        cgs.media.yourTeamTookEnemyFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_flag.wav", qtrue );
 
592
                }
 
593
 
 
594
#ifdef MISSIONPACK
 
595
                if ( cgs.gametype == GT_1FCTF || cg_buildScript.integer ) {
 
596
                        // FIXME: get a replacement for this sound ?
 
597
                        cgs.media.neutralFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue );
 
598
                        cgs.media.yourTeamTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_1flag.wav", qtrue );
 
599
                        cgs.media.enemyTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_1flag.wav", qtrue );
 
600
                }
 
601
 
 
602
                if ( cgs.gametype == GT_1FCTF || cgs.gametype == GT_CTF || cg_buildScript.integer ) {
 
603
                        cgs.media.youHaveFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_you_flag.wav", qtrue );
 
604
                        cgs.media.holyShitSound = trap_S_RegisterSound("sound/feedback/voc_holyshit.wav", qtrue);
 
605
                }
 
606
 
 
607
                if ( cgs.gametype == GT_OBELISK || cg_buildScript.integer ) {
 
608
                        cgs.media.yourBaseIsUnderAttackSound = trap_S_RegisterSound( "sound/teamplay/voc_base_attack.wav", qtrue );
 
609
                }
 
610
#else
 
611
                cgs.media.youHaveFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_you_flag.wav", qtrue );
 
612
                cgs.media.holyShitSound = trap_S_RegisterSound("sound/feedback/voc_holyshit.wav", qtrue);
 
613
                cgs.media.neutralFlagReturnedSound = trap_S_RegisterSound( "sound/teamplay/flagreturn_opponent.wav", qtrue );
 
614
                cgs.media.yourTeamTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_team_1flag.wav", qtrue );
 
615
                cgs.media.enemyTookTheFlagSound = trap_S_RegisterSound( "sound/teamplay/voc_enemy_1flag.wav", qtrue );
 
616
#endif
 
617
        }
 
618
 
 
619
        cgs.media.tracerSound = trap_S_RegisterSound( "sound/weapons/machinegun/buletby1.wav", qfalse );
 
620
        cgs.media.selectSound = trap_S_RegisterSound( "sound/weapons/change.wav", qfalse );
 
621
        cgs.media.wearOffSound = trap_S_RegisterSound( "sound/items/wearoff.wav", qfalse );
 
622
        cgs.media.useNothingSound = trap_S_RegisterSound( "sound/items/use_nothing.wav", qfalse );
 
623
        cgs.media.gibSound = trap_S_RegisterSound( "sound/player/gibsplt1.wav", qfalse );
 
624
        cgs.media.gibBounce1Sound = trap_S_RegisterSound( "sound/player/gibimp1.wav", qfalse );
 
625
        cgs.media.gibBounce2Sound = trap_S_RegisterSound( "sound/player/gibimp2.wav", qfalse );
 
626
        cgs.media.gibBounce3Sound = trap_S_RegisterSound( "sound/player/gibimp3.wav", qfalse );
 
627
 
 
628
#ifdef MISSIONPACK
 
629
        cgs.media.useInvulnerabilitySound = trap_S_RegisterSound( "sound/items/invul_activate.wav", qfalse );
 
630
        cgs.media.invulnerabilityImpactSound1 = trap_S_RegisterSound( "sound/items/invul_impact_01.wav", qfalse );
 
631
        cgs.media.invulnerabilityImpactSound2 = trap_S_RegisterSound( "sound/items/invul_impact_02.wav", qfalse );
 
632
        cgs.media.invulnerabilityImpactSound3 = trap_S_RegisterSound( "sound/items/invul_impact_03.wav", qfalse );
 
633
        cgs.media.invulnerabilityJuicedSound = trap_S_RegisterSound( "sound/items/invul_juiced.wav", qfalse );
 
634
        cgs.media.obeliskHitSound1 = trap_S_RegisterSound( "sound/items/obelisk_hit_01.wav", qfalse );
 
635
        cgs.media.obeliskHitSound2 = trap_S_RegisterSound( "sound/items/obelisk_hit_02.wav", qfalse );
 
636
        cgs.media.obeliskHitSound3 = trap_S_RegisterSound( "sound/items/obelisk_hit_03.wav", qfalse );
 
637
        cgs.media.obeliskRespawnSound = trap_S_RegisterSound( "sound/items/obelisk_respawn.wav", qfalse );
 
638
 
 
639
        cgs.media.ammoregenSound = trap_S_RegisterSound("sound/items/cl_ammoregen.wav", qfalse);
 
640
        cgs.media.doublerSound = trap_S_RegisterSound("sound/items/cl_doubler.wav", qfalse);
 
641
        cgs.media.guardSound = trap_S_RegisterSound("sound/items/cl_guard.wav", qfalse);
 
642
        cgs.media.scoutSound = trap_S_RegisterSound("sound/items/cl_scout.wav", qfalse);
 
643
#endif
 
644
 
 
645
        cgs.media.teleInSound = trap_S_RegisterSound( "sound/world/telein.wav", qfalse );
 
646
        cgs.media.teleOutSound = trap_S_RegisterSound( "sound/world/teleout.wav", qfalse );
 
647
        cgs.media.respawnSound = trap_S_RegisterSound( "sound/items/respawn1.wav", qfalse );
 
648
 
 
649
        cgs.media.noAmmoSound = trap_S_RegisterSound( "sound/weapons/noammo.wav", qfalse );
 
650
 
 
651
        cgs.media.talkSound = trap_S_RegisterSound( "sound/player/talk.wav", qfalse );
 
652
        cgs.media.landSound = trap_S_RegisterSound( "sound/player/land1.wav", qfalse);
 
653
 
 
654
        cgs.media.hitSound = trap_S_RegisterSound( "sound/feedback/hit.wav", qfalse );
 
655
#ifdef MISSIONPACK
 
656
        cgs.media.hitSoundHighArmor = trap_S_RegisterSound( "sound/feedback/hithi.wav", qfalse );
 
657
        cgs.media.hitSoundLowArmor = trap_S_RegisterSound( "sound/feedback/hitlo.wav", qfalse );
 
658
#endif
 
659
 
 
660
        cgs.media.impressiveSound = trap_S_RegisterSound( "sound/feedback/impressive.wav", qtrue );
 
661
        cgs.media.excellentSound = trap_S_RegisterSound( "sound/feedback/excellent.wav", qtrue );
 
662
        cgs.media.deniedSound = trap_S_RegisterSound( "sound/feedback/denied.wav", qtrue );
 
663
        cgs.media.humiliationSound = trap_S_RegisterSound( "sound/feedback/humiliation.wav", qtrue );
 
664
        cgs.media.assistSound = trap_S_RegisterSound( "sound/feedback/assist.wav", qtrue );
 
665
        cgs.media.defendSound = trap_S_RegisterSound( "sound/feedback/defense.wav", qtrue );
 
666
#ifdef MISSIONPACK
 
667
        cgs.media.firstImpressiveSound = trap_S_RegisterSound( "sound/feedback/first_impressive.wav", qtrue );
 
668
        cgs.media.firstExcellentSound = trap_S_RegisterSound( "sound/feedback/first_excellent.wav", qtrue );
 
669
        cgs.media.firstHumiliationSound = trap_S_RegisterSound( "sound/feedback/first_gauntlet.wav", qtrue );
 
670
#endif
 
671
 
 
672
        cgs.media.takenLeadSound = trap_S_RegisterSound( "sound/feedback/takenlead.wav", qtrue);
 
673
        cgs.media.tiedLeadSound = trap_S_RegisterSound( "sound/feedback/tiedlead.wav", qtrue);
 
674
        cgs.media.lostLeadSound = trap_S_RegisterSound( "sound/feedback/lostlead.wav", qtrue);
 
675
 
 
676
#ifdef MISSIONPACK
 
677
        cgs.media.voteNow = trap_S_RegisterSound( "sound/feedback/vote_now.wav", qtrue);
 
678
        cgs.media.votePassed = trap_S_RegisterSound( "sound/feedback/vote_passed.wav", qtrue);
 
679
        cgs.media.voteFailed = trap_S_RegisterSound( "sound/feedback/vote_failed.wav", qtrue);
 
680
#endif
 
681
 
 
682
        cgs.media.watrInSound = trap_S_RegisterSound( "sound/player/watr_in.wav", qfalse);
 
683
        cgs.media.watrOutSound = trap_S_RegisterSound( "sound/player/watr_out.wav", qfalse);
 
684
        cgs.media.watrUnSound = trap_S_RegisterSound( "sound/player/watr_un.wav", qfalse);
 
685
 
 
686
        cgs.media.jumpPadSound = trap_S_RegisterSound ("sound/world/jumppad.wav", qfalse );
 
687
 
 
688
        for (i=0 ; i<4 ; i++) {
 
689
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/step%i.wav", i+1);
 
690
                cgs.media.footsteps[FOOTSTEP_NORMAL][i] = trap_S_RegisterSound (name, qfalse);
 
691
 
 
692
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/boot%i.wav", i+1);
 
693
                cgs.media.footsteps[FOOTSTEP_BOOT][i] = trap_S_RegisterSound (name, qfalse);
 
694
 
 
695
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/flesh%i.wav", i+1);
 
696
                cgs.media.footsteps[FOOTSTEP_FLESH][i] = trap_S_RegisterSound (name, qfalse);
 
697
 
 
698
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/mech%i.wav", i+1);
 
699
                cgs.media.footsteps[FOOTSTEP_MECH][i] = trap_S_RegisterSound (name, qfalse);
 
700
 
 
701
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/energy%i.wav", i+1);
 
702
                cgs.media.footsteps[FOOTSTEP_ENERGY][i] = trap_S_RegisterSound (name, qfalse);
 
703
 
 
704
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/splash%i.wav", i+1);
 
705
                cgs.media.footsteps[FOOTSTEP_SPLASH][i] = trap_S_RegisterSound (name, qfalse);
 
706
 
 
707
                Com_sprintf (name, sizeof(name), "sound/player/footsteps/clank%i.wav", i+1);
 
708
                cgs.media.footsteps[FOOTSTEP_METAL][i] = trap_S_RegisterSound (name, qfalse);
 
709
        }
 
710
 
 
711
        // only register the items that the server says we need
 
712
        Q_strncpyz(items, CG_ConfigString(CS_ITEMS), sizeof(items));
 
713
 
 
714
        for ( i = 1 ; i < bg_numItems ; i++ ) {
 
715
//              if ( items[ i ] == '1' || cg_buildScript.integer ) {
 
716
                        CG_RegisterItemSounds( i );
 
717
//              }
 
718
        }
 
719
 
 
720
        for ( i = 1 ; i < MAX_SOUNDS ; i++ ) {
 
721
                soundName = CG_ConfigString( CS_SOUNDS+i );
 
722
                if ( !soundName[0] ) {
 
723
                        break;
 
724
                }
 
725
                if ( soundName[0] == '*' ) {
 
726
                        continue;       // custom sound
 
727
                }
 
728
                cgs.gameSounds[i] = trap_S_RegisterSound( soundName, qfalse );
 
729
        }
 
730
 
 
731
        // FIXME: only needed with item
 
732
        cgs.media.flightSound = trap_S_RegisterSound( "sound/items/flight.wav", qfalse );
 
733
        cgs.media.medkitSound = trap_S_RegisterSound ("sound/items/use_medkit.wav", qfalse);
 
734
        cgs.media.quadSound = trap_S_RegisterSound("sound/items/damage3.wav", qfalse);
 
735
        cgs.media.sfx_ric1 = trap_S_RegisterSound ("sound/weapons/machinegun/ric1.wav", qfalse);
 
736
        cgs.media.sfx_ric2 = trap_S_RegisterSound ("sound/weapons/machinegun/ric2.wav", qfalse);
 
737
        cgs.media.sfx_ric3 = trap_S_RegisterSound ("sound/weapons/machinegun/ric3.wav", qfalse);
 
738
        cgs.media.sfx_railg = trap_S_RegisterSound ("sound/weapons/railgun/railgf1a.wav", qfalse);
 
739
        cgs.media.sfx_rockexp = trap_S_RegisterSound ("sound/weapons/rocket/rocklx1a.wav", qfalse);
 
740
        cgs.media.sfx_plasmaexp = trap_S_RegisterSound ("sound/weapons/plasma/plasmx1a.wav", qfalse);
 
741
#ifdef MISSIONPACK
 
742
        cgs.media.sfx_proxexp = trap_S_RegisterSound( "sound/weapons/proxmine/wstbexpl.wav" , qfalse);
 
743
        cgs.media.sfx_nghit = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpd.wav" , qfalse);
 
744
        cgs.media.sfx_nghitflesh = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpl.wav" , qfalse);
 
745
        cgs.media.sfx_nghitmetal = trap_S_RegisterSound( "sound/weapons/nailgun/wnalimpm.wav", qfalse );
 
746
        cgs.media.sfx_chghit = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpd.wav", qfalse );
 
747
        cgs.media.sfx_chghitflesh = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpl.wav", qfalse );
 
748
        cgs.media.sfx_chghitmetal = trap_S_RegisterSound( "sound/weapons/vulcan/wvulimpm.wav", qfalse );
 
749
        cgs.media.weaponHoverSound = trap_S_RegisterSound( "sound/weapons/weapon_hover.wav", qfalse );
 
750
        cgs.media.kamikazeExplodeSound = trap_S_RegisterSound( "sound/items/kam_explode.wav", qfalse );
 
751
        cgs.media.kamikazeImplodeSound = trap_S_RegisterSound( "sound/items/kam_implode.wav", qfalse );
 
752
        cgs.media.kamikazeFarSound = trap_S_RegisterSound( "sound/items/kam_explode_far.wav", qfalse );
 
753
        cgs.media.winnerSound = trap_S_RegisterSound( "sound/feedback/voc_youwin.wav", qfalse );
 
754
        cgs.media.loserSound = trap_S_RegisterSound( "sound/feedback/voc_youlose.wav", qfalse );
 
755
        cgs.media.youSuckSound = trap_S_RegisterSound( "sound/misc/yousuck.wav", qfalse );
 
756
 
 
757
        cgs.media.wstbimplSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpl.wav", qfalse);
 
758
        cgs.media.wstbimpmSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpm.wav", qfalse);
 
759
        cgs.media.wstbimpdSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbimpd.wav", qfalse);
 
760
        cgs.media.wstbactvSound = trap_S_RegisterSound("sound/weapons/proxmine/wstbactv.wav", qfalse);
 
761
#endif
 
762
 
 
763
        cgs.media.regenSound = trap_S_RegisterSound("sound/items/regen.wav", qfalse);
 
764
        cgs.media.protectSound = trap_S_RegisterSound("sound/items/protect3.wav", qfalse);
 
765
        cgs.media.n_healthSound = trap_S_RegisterSound("sound/items/n_health.wav", qfalse );
 
766
        cgs.media.hgrenb1aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb1a.wav", qfalse);
 
767
        cgs.media.hgrenb2aSound = trap_S_RegisterSound("sound/weapons/grenade/hgrenb2a.wav", qfalse);
 
768
 
 
769
#ifdef MISSIONPACK
 
770
        trap_S_RegisterSound("sound/player/james/death1.wav", qfalse );
 
771
        trap_S_RegisterSound("sound/player/james/death2.wav", qfalse );
 
772
        trap_S_RegisterSound("sound/player/james/death3.wav", qfalse );
 
773
        trap_S_RegisterSound("sound/player/james/jump1.wav", qfalse );
 
774
        trap_S_RegisterSound("sound/player/james/pain25_1.wav", qfalse );
 
775
        trap_S_RegisterSound("sound/player/james/pain75_1.wav", qfalse );
 
776
        trap_S_RegisterSound("sound/player/james/pain100_1.wav", qfalse );
 
777
        trap_S_RegisterSound("sound/player/james/falling1.wav", qfalse );
 
778
        trap_S_RegisterSound("sound/player/james/gasp.wav", qfalse );
 
779
        trap_S_RegisterSound("sound/player/james/drown.wav", qfalse );
 
780
        trap_S_RegisterSound("sound/player/james/fall1.wav", qfalse );
 
781
        trap_S_RegisterSound("sound/player/james/taunt.wav", qfalse );
 
782
 
 
783
        trap_S_RegisterSound("sound/player/janet/death1.wav", qfalse );
 
784
        trap_S_RegisterSound("sound/player/janet/death2.wav", qfalse );
 
785
        trap_S_RegisterSound("sound/player/janet/death3.wav", qfalse );
 
786
        trap_S_RegisterSound("sound/player/janet/jump1.wav", qfalse );
 
787
        trap_S_RegisterSound("sound/player/janet/pain25_1.wav", qfalse );
 
788
        trap_S_RegisterSound("sound/player/janet/pain75_1.wav", qfalse );
 
789
        trap_S_RegisterSound("sound/player/janet/pain100_1.wav", qfalse );
 
790
        trap_S_RegisterSound("sound/player/janet/falling1.wav", qfalse );
 
791
        trap_S_RegisterSound("sound/player/janet/gasp.wav", qfalse );
 
792
        trap_S_RegisterSound("sound/player/janet/drown.wav", qfalse );
 
793
        trap_S_RegisterSound("sound/player/janet/fall1.wav", qfalse );
 
794
        trap_S_RegisterSound("sound/player/janet/taunt.wav", qfalse );
 
795
#endif
 
796
 
 
797
}
 
798
 
 
799
 
 
800
//===================================================================================
 
801
 
 
802
 
 
803
/*
 
804
=================
 
805
CG_RegisterGraphics
 
806
 
 
807
This function may execute for a couple of minutes with a slow disk.
 
808
=================
 
809
*/
 
810
static void CG_RegisterGraphics( void ) {
 
811
        int                     i;
 
812
        char            items[MAX_ITEMS+1];
 
813
        static char             *sb_nums[11] = {
 
814
                "gfx/2d/numbers/zero_32b",
 
815
                "gfx/2d/numbers/one_32b",
 
816
                "gfx/2d/numbers/two_32b",
 
817
                "gfx/2d/numbers/three_32b",
 
818
                "gfx/2d/numbers/four_32b",
 
819
                "gfx/2d/numbers/five_32b",
 
820
                "gfx/2d/numbers/six_32b",
 
821
                "gfx/2d/numbers/seven_32b",
 
822
                "gfx/2d/numbers/eight_32b",
 
823
                "gfx/2d/numbers/nine_32b",
 
824
                "gfx/2d/numbers/minus_32b",
 
825
        };
 
826
 
 
827
        // clear any references to old media
 
828
        memset( &cg.refdef, 0, sizeof( cg.refdef ) );
 
829
        trap_R_ClearScene();
 
830
 
 
831
        CG_LoadingString( cgs.mapname );
 
832
 
 
833
        trap_R_LoadWorldMap( cgs.mapname );
 
834
 
 
835
        // precache status bar pics
 
836
        CG_LoadingString( "game media" );
 
837
 
 
838
        for ( i=0 ; i<11 ; i++) {
 
839
                cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] );
 
840
        }
 
841
 
 
842
        cgs.media.botSkillShaders[0] = trap_R_RegisterShader( "menu/art/skill1.tga" );
 
843
        cgs.media.botSkillShaders[1] = trap_R_RegisterShader( "menu/art/skill2.tga" );
 
844
        cgs.media.botSkillShaders[2] = trap_R_RegisterShader( "menu/art/skill3.tga" );
 
845
        cgs.media.botSkillShaders[3] = trap_R_RegisterShader( "menu/art/skill4.tga" );
 
846
        cgs.media.botSkillShaders[4] = trap_R_RegisterShader( "menu/art/skill5.tga" );
 
847
 
 
848
        cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" );
 
849
 
 
850
        cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" );
 
851
 
 
852
        cgs.media.scoreboardName = trap_R_RegisterShaderNoMip( "menu/tab/name.tga" );
 
853
        cgs.media.scoreboardPing = trap_R_RegisterShaderNoMip( "menu/tab/ping.tga" );
 
854
        cgs.media.scoreboardScore = trap_R_RegisterShaderNoMip( "menu/tab/score.tga" );
 
855
        cgs.media.scoreboardTime = trap_R_RegisterShaderNoMip( "menu/tab/time.tga" );
 
856
 
 
857
        cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" );
 
858
        cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" );
 
859
        cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" );
 
860
#ifdef MISSIONPACK
 
861
        cgs.media.nailPuffShader = trap_R_RegisterShader( "nailtrail" );
 
862
        cgs.media.blueProxMine = trap_R_RegisterModel( "models/weaphits/proxmineb.md3" );
 
863
#endif
 
864
        cgs.media.plasmaBallShader = trap_R_RegisterShader( "sprites/plasma1" );
 
865
        cgs.media.bloodTrailShader = trap_R_RegisterShader( "bloodTrail" );
 
866
        cgs.media.lagometerShader = trap_R_RegisterShader("lagometer" );
 
867
        cgs.media.connectionShader = trap_R_RegisterShader( "disconnected" );
 
868
 
 
869
        cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" );
 
870
 
 
871
        cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" );
 
872
        cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" );
 
873
 
 
874
        for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) {
 
875
                cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("gfx/2d/crosshair%c", 'a'+i) );
 
876
        }
 
877
 
 
878
        cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" );
 
879
        cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" );
 
880
 
 
881
        // powerup shaders
 
882
        cgs.media.quadShader = trap_R_RegisterShader("powerups/quad" );
 
883
        cgs.media.quadWeaponShader = trap_R_RegisterShader("powerups/quadWeapon" );
 
884
        cgs.media.battleSuitShader = trap_R_RegisterShader("powerups/battleSuit" );
 
885
        cgs.media.battleWeaponShader = trap_R_RegisterShader("powerups/battleWeapon" );
 
886
        cgs.media.invisShader = trap_R_RegisterShader("powerups/invisibility" );
 
887
        cgs.media.regenShader = trap_R_RegisterShader("powerups/regen" );
 
888
        cgs.media.hastePuffShader = trap_R_RegisterShader("hasteSmokePuff" );
 
889
 
 
890
#ifdef MISSIONPACK
 
891
        if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) {
 
892
#else
 
893
        if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) {
 
894
#endif
 
895
                cgs.media.redCubeModel = trap_R_RegisterModel( "models/powerups/orb/r_orb.md3" );
 
896
                cgs.media.blueCubeModel = trap_R_RegisterModel( "models/powerups/orb/b_orb.md3" );
 
897
                cgs.media.redCubeIcon = trap_R_RegisterShader( "icons/skull_red" );
 
898
                cgs.media.blueCubeIcon = trap_R_RegisterShader( "icons/skull_blue" );
 
899
        }
 
900
 
 
901
#ifdef MISSIONPACK
 
902
        if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) {
 
903
#else
 
904
        if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) {
 
905
#endif
 
906
                cgs.media.redFlagModel = trap_R_RegisterModel( "models/flags/r_flag.md3" );
 
907
                cgs.media.blueFlagModel = trap_R_RegisterModel( "models/flags/b_flag.md3" );
 
908
                cgs.media.redFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_red1" );
 
909
                cgs.media.redFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" );
 
910
                cgs.media.redFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_red3" );
 
911
                cgs.media.blueFlagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_blu1" );
 
912
                cgs.media.blueFlagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" );
 
913
                cgs.media.blueFlagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu3" );
 
914
#ifdef MISSIONPACK
 
915
                cgs.media.flagPoleModel = trap_R_RegisterModel( "models/flag2/flagpole.md3" );
 
916
                cgs.media.flagFlapModel = trap_R_RegisterModel( "models/flag2/flagflap3.md3" );
 
917
 
 
918
                cgs.media.redFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/red.skin" );
 
919
                cgs.media.blueFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/blue.skin" );
 
920
                cgs.media.neutralFlagFlapSkin = trap_R_RegisterSkin( "models/flag2/white.skin" );
 
921
 
 
922
                cgs.media.redFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/red_base.md3" );
 
923
                cgs.media.blueFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/blue_base.md3" );
 
924
                cgs.media.neutralFlagBaseModel = trap_R_RegisterModel( "models/mapobjects/flagbase/ntrl_base.md3" );
 
925
#endif
 
926
        }
 
927
 
 
928
#ifdef MISSIONPACK
 
929
        if ( cgs.gametype == GT_1FCTF || cg_buildScript.integer ) {
 
930
                cgs.media.neutralFlagModel = trap_R_RegisterModel( "models/flags/n_flag.md3" );
 
931
                cgs.media.flagShader[0] = trap_R_RegisterShaderNoMip( "icons/iconf_neutral1" );
 
932
                cgs.media.flagShader[1] = trap_R_RegisterShaderNoMip( "icons/iconf_red2" );
 
933
                cgs.media.flagShader[2] = trap_R_RegisterShaderNoMip( "icons/iconf_blu2" );
 
934
                cgs.media.flagShader[3] = trap_R_RegisterShaderNoMip( "icons/iconf_neutral3" );
 
935
        }
 
936
 
 
937
        if ( cgs.gametype == GT_OBELISK || cg_buildScript.integer ) {
 
938
                cgs.media.overloadBaseModel = trap_R_RegisterModel( "models/powerups/overload_base.md3" );
 
939
                cgs.media.overloadTargetModel = trap_R_RegisterModel( "models/powerups/overload_target.md3" );
 
940
                cgs.media.overloadLightsModel = trap_R_RegisterModel( "models/powerups/overload_lights.md3" );
 
941
                cgs.media.overloadEnergyModel = trap_R_RegisterModel( "models/powerups/overload_energy.md3" );
 
942
        }
 
943
 
 
944
        if ( cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) {
 
945
                cgs.media.harvesterModel = trap_R_RegisterModel( "models/powerups/harvester/harvester.md3" );
 
946
                cgs.media.harvesterRedSkin = trap_R_RegisterSkin( "models/powerups/harvester/red.skin" );
 
947
                cgs.media.harvesterBlueSkin = trap_R_RegisterSkin( "models/powerups/harvester/blue.skin" );
 
948
                cgs.media.harvesterNeutralModel = trap_R_RegisterModel( "models/powerups/obelisk/obelisk.md3" );
 
949
        }
 
950
 
 
951
        cgs.media.redKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikred" );
 
952
        cgs.media.dustPuffShader = trap_R_RegisterShader("hasteSmokePuff" );
 
953
#endif
 
954
 
 
955
        if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) {
 
956
                cgs.media.friendShader = trap_R_RegisterShader( "sprites/foe" );
 
957
                cgs.media.redQuadShader = trap_R_RegisterShader("powerups/blueflag" );
 
958
                cgs.media.teamStatusBar = trap_R_RegisterShader( "gfx/2d/colorbar.tga" );
 
959
#ifdef MISSIONPACK
 
960
                cgs.media.blueKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikblu" );
 
961
#endif
 
962
        }
 
963
 
 
964
        cgs.media.armorModel = trap_R_RegisterModel( "models/powerups/armor/armor_yel.md3" );
 
965
        cgs.media.armorIcon  = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" );
 
966
 
 
967
        cgs.media.machinegunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/m_shell.md3" );
 
968
        cgs.media.shotgunBrassModel = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" );
 
969
 
 
970
        cgs.media.gibAbdomen = trap_R_RegisterModel( "models/gibs/abdomen.md3" );
 
971
        cgs.media.gibArm = trap_R_RegisterModel( "models/gibs/arm.md3" );
 
972
        cgs.media.gibChest = trap_R_RegisterModel( "models/gibs/chest.md3" );
 
973
        cgs.media.gibFist = trap_R_RegisterModel( "models/gibs/fist.md3" );
 
974
        cgs.media.gibFoot = trap_R_RegisterModel( "models/gibs/foot.md3" );
 
975
        cgs.media.gibForearm = trap_R_RegisterModel( "models/gibs/forearm.md3" );
 
976
        cgs.media.gibIntestine = trap_R_RegisterModel( "models/gibs/intestine.md3" );
 
977
        cgs.media.gibLeg = trap_R_RegisterModel( "models/gibs/leg.md3" );
 
978
        cgs.media.gibSkull = trap_R_RegisterModel( "models/gibs/skull.md3" );
 
979
        cgs.media.gibBrain = trap_R_RegisterModel( "models/gibs/brain.md3" );
 
980
 
 
981
        cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" );
 
982
 
 
983
        cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" );
 
984
 
 
985
        cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" );
 
986
 
 
987
        cgs.media.bulletFlashModel = trap_R_RegisterModel("models/weaphits/bullet.md3");
 
988
        cgs.media.ringFlashModel = trap_R_RegisterModel("models/weaphits/ring02.md3");
 
989
        cgs.media.dishFlashModel = trap_R_RegisterModel("models/weaphits/boom01.md3");
 
990
#ifdef MISSIONPACK
 
991
        cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/powerups/pop.md3" );
 
992
#else
 
993
        cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" );
 
994
        cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" );
 
995
#endif
 
996
#ifdef MISSIONPACK
 
997
        cgs.media.kamikazeEffectModel = trap_R_RegisterModel( "models/weaphits/kamboom2.md3" );
 
998
        cgs.media.kamikazeShockWave = trap_R_RegisterModel( "models/weaphits/kamwave.md3" );
 
999
        cgs.media.kamikazeHeadModel = trap_R_RegisterModel( "models/powerups/kamikazi.md3" );
 
1000
        cgs.media.kamikazeHeadTrail = trap_R_RegisterModel( "models/powerups/trailtest.md3" );
 
1001
        cgs.media.guardPowerupModel = trap_R_RegisterModel( "models/powerups/guard_player.md3" );
 
1002
        cgs.media.scoutPowerupModel = trap_R_RegisterModel( "models/powerups/scout_player.md3" );
 
1003
        cgs.media.doublerPowerupModel = trap_R_RegisterModel( "models/powerups/doubler_player.md3" );
 
1004
        cgs.media.ammoRegenPowerupModel = trap_R_RegisterModel( "models/powerups/ammo_player.md3" );
 
1005
        cgs.media.invulnerabilityImpactModel = trap_R_RegisterModel( "models/powerups/shield/impact.md3" );
 
1006
        cgs.media.invulnerabilityJuicedModel = trap_R_RegisterModel( "models/powerups/shield/juicer.md3" );
 
1007
        cgs.media.medkitUsageModel = trap_R_RegisterModel( "models/powerups/regen.md3" );
 
1008
        cgs.media.heartShader = trap_R_RegisterShaderNoMip( "ui/assets/statusbar/selectedhealth.tga" );
 
1009
 
 
1010
#endif
 
1011
 
 
1012
        cgs.media.invulnerabilityPowerupModel = trap_R_RegisterModel( "models/powerups/shield/shield.md3" );
 
1013
        cgs.media.medalImpressive = trap_R_RegisterShaderNoMip( "medal_impressive" );
 
1014
        cgs.media.medalExcellent = trap_R_RegisterShaderNoMip( "medal_excellent" );
 
1015
        cgs.media.medalGauntlet = trap_R_RegisterShaderNoMip( "medal_gauntlet" );
 
1016
        cgs.media.medalDefend = trap_R_RegisterShaderNoMip( "medal_defend" );
 
1017
        cgs.media.medalAssist = trap_R_RegisterShaderNoMip( "medal_assist" );
 
1018
        cgs.media.medalCapture = trap_R_RegisterShaderNoMip( "medal_capture" );
 
1019
 
 
1020
 
 
1021
        memset( cg_items, 0, sizeof( cg_items ) );
 
1022
        memset( cg_weapons, 0, sizeof( cg_weapons ) );
 
1023
 
 
1024
        // only register the items that the server says we need
 
1025
        Q_strncpyz(items, CG_ConfigString(CS_ITEMS), sizeof(items));
 
1026
 
 
1027
        for ( i = 1 ; i < bg_numItems ; i++ ) {
 
1028
                if ( items[ i ] == '1' || cg_buildScript.integer ) {
 
1029
                        CG_LoadingItem( i );
 
1030
                        CG_RegisterItemVisuals( i );
 
1031
                }
 
1032
        }
 
1033
 
 
1034
        // wall marks
 
1035
        cgs.media.bulletMarkShader = trap_R_RegisterShader( "gfx/damage/bullet_mrk" );
 
1036
        cgs.media.burnMarkShader = trap_R_RegisterShader( "gfx/damage/burn_med_mrk" );
 
1037
        cgs.media.holeMarkShader = trap_R_RegisterShader( "gfx/damage/hole_lg_mrk" );
 
1038
        cgs.media.energyMarkShader = trap_R_RegisterShader( "gfx/damage/plasma_mrk" );
 
1039
        cgs.media.shadowMarkShader = trap_R_RegisterShader( "markShadow" );
 
1040
        cgs.media.wakeMarkShader = trap_R_RegisterShader( "wake" );
 
1041
        cgs.media.bloodMarkShader = trap_R_RegisterShader( "bloodMark" );
 
1042
 
 
1043
        // register the inline models
 
1044
        cgs.numInlineModels = trap_CM_NumInlineModels();
 
1045
        for ( i = 1 ; i < cgs.numInlineModels ; i++ ) {
 
1046
                char    name[10];
 
1047
                vec3_t                  mins, maxs;
 
1048
                int                             j;
 
1049
 
 
1050
                Com_sprintf( name, sizeof(name), "*%i", i );
 
1051
                cgs.inlineDrawModel[i] = trap_R_RegisterModel( name );
 
1052
                trap_R_ModelBounds( cgs.inlineDrawModel[i], mins, maxs );
 
1053
                for ( j = 0 ; j < 3 ; j++ ) {
 
1054
                        cgs.inlineModelMidpoints[i][j] = mins[j] + 0.5 * ( maxs[j] - mins[j] );
 
1055
                }
 
1056
        }
 
1057
 
 
1058
        // register all the server specified models
 
1059
        for (i=1 ; i<MAX_MODELS ; i++) {
 
1060
                const char              *modelName;
 
1061
 
 
1062
                modelName = CG_ConfigString( CS_MODELS+i );
 
1063
                if ( !modelName[0] ) {
 
1064
                        break;
 
1065
                }
 
1066
                cgs.gameModels[i] = trap_R_RegisterModel( modelName );
 
1067
        }
 
1068
 
 
1069
#ifdef MISSIONPACK
 
1070
        // new stuff
 
1071
        cgs.media.patrolShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/patrol.tga");
 
1072
        cgs.media.assaultShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/assault.tga");
 
1073
        cgs.media.campShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/camp.tga");
 
1074
        cgs.media.followShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/follow.tga");
 
1075
        cgs.media.defendShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/defend.tga");
 
1076
        cgs.media.teamLeaderShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/team_leader.tga");
 
1077
        cgs.media.retrieveShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/retrieve.tga");
 
1078
        cgs.media.escortShader = trap_R_RegisterShaderNoMip("ui/assets/statusbar/escort.tga");
 
1079
        cgs.media.cursor = trap_R_RegisterShaderNoMip( "menu/art/3_cursor2" );
 
1080
        cgs.media.sizeCursor = trap_R_RegisterShaderNoMip( "ui/assets/sizecursor.tga" );
 
1081
        cgs.media.selectCursor = trap_R_RegisterShaderNoMip( "ui/assets/selectcursor.tga" );
 
1082
        cgs.media.flagShaders[0] = trap_R_RegisterShaderNoMip("ui/assets/statusbar/flag_in_base.tga");
 
1083
        cgs.media.flagShaders[1] = trap_R_RegisterShaderNoMip("ui/assets/statusbar/flag_capture.tga");
 
1084
        cgs.media.flagShaders[2] = trap_R_RegisterShaderNoMip("ui/assets/statusbar/flag_missing.tga");
 
1085
 
 
1086
        trap_R_RegisterModel( "models/players/james/lower.md3" );
 
1087
        trap_R_RegisterModel( "models/players/james/upper.md3" );
 
1088
        trap_R_RegisterModel( "models/players/heads/james/james.md3" );
 
1089
 
 
1090
        trap_R_RegisterModel( "models/players/janet/lower.md3" );
 
1091
        trap_R_RegisterModel( "models/players/janet/upper.md3" );
 
1092
        trap_R_RegisterModel( "models/players/heads/janet/janet.md3" );
 
1093
 
 
1094
#endif
 
1095
        CG_ClearParticles ();
 
1096
/*
 
1097
        for (i=1; i<MAX_PARTICLES_AREAS; i++)
 
1098
        {
 
1099
                {
 
1100
                        int rval;
 
1101
 
 
1102
                        rval = CG_NewParticleArea ( CS_PARTICLES + i);
 
1103
                        if (!rval)
 
1104
                                break;
 
1105
                }
 
1106
        }
 
1107
*/
 
1108
}
 
1109
 
 
1110
 
 
1111
 
 
1112
/*                                                                                                                                                                                                                                                                                      
 
1113
=======================
 
1114
CG_BuildSpectatorString
 
1115
 
 
1116
=======================
 
1117
*/
 
1118
void CG_BuildSpectatorString(void) {
 
1119
        int i;
 
1120
        cg.spectatorList[0] = 0;
 
1121
        for (i = 0; i < MAX_CLIENTS; i++) {
 
1122
                if (cgs.clientinfo[i].infoValid && cgs.clientinfo[i].team == TEAM_SPECTATOR ) {
 
1123
                        Q_strcat(cg.spectatorList, sizeof(cg.spectatorList), va("%s     ", cgs.clientinfo[i].name));
 
1124
                }
 
1125
        }
 
1126
        i = strlen(cg.spectatorList);
 
1127
        if (i != cg.spectatorLen) {
 
1128
                cg.spectatorLen = i;
 
1129
                cg.spectatorWidth = -1;
 
1130
        }
 
1131
}
 
1132
 
 
1133
 
 
1134
/*                                                                                                                                                                                                                                                                                      
 
1135
===================
 
1136
CG_RegisterClients
 
1137
===================
 
1138
*/
 
1139
static void CG_RegisterClients( void ) {
 
1140
        int             i;
 
1141
 
 
1142
        CG_LoadingClient(cg.clientNum);
 
1143
        CG_NewClientInfo(cg.clientNum);
 
1144
 
 
1145
        for (i=0 ; i<MAX_CLIENTS ; i++) {
 
1146
                const char              *clientInfo;
 
1147
 
 
1148
                if (cg.clientNum == i) {
 
1149
                        continue;
 
1150
                }
 
1151
 
 
1152
                clientInfo = CG_ConfigString( CS_PLAYERS+i );
 
1153
                if ( !clientInfo[0]) {
 
1154
                        continue;
 
1155
                }
 
1156
                CG_LoadingClient( i );
 
1157
                CG_NewClientInfo( i );
 
1158
        }
 
1159
        CG_BuildSpectatorString();
 
1160
}
 
1161
 
 
1162
//===========================================================================
 
1163
 
 
1164
/*
 
1165
=================
 
1166
CG_ConfigString
 
1167
=================
 
1168
*/
 
1169
const char *CG_ConfigString( int index ) {
 
1170
        if ( index < 0 || index >= MAX_CONFIGSTRINGS ) {
 
1171
                CG_Error( "CG_ConfigString: bad index: %i", index );
 
1172
        }
 
1173
        return cgs.gameState.stringData + cgs.gameState.stringOffsets[ index ];
 
1174
}
 
1175
 
 
1176
//==================================================================
 
1177
 
 
1178
/*
 
1179
======================
 
1180
CG_StartMusic
 
1181
 
 
1182
======================
 
1183
*/
 
1184
void CG_StartMusic( void ) {
 
1185
        char    *s;
 
1186
        char    parm1[MAX_QPATH], parm2[MAX_QPATH];
 
1187
 
 
1188
        // start the background music
 
1189
        s = (char *)CG_ConfigString( CS_MUSIC );
 
1190
        Q_strncpyz( parm1, COM_Parse( &s ), sizeof( parm1 ) );
 
1191
        Q_strncpyz( parm2, COM_Parse( &s ), sizeof( parm2 ) );
 
1192
 
 
1193
        trap_S_StartBackgroundTrack( parm1, parm2 );
 
1194
}
 
1195
#ifdef MISSIONPACK
 
1196
char *CG_GetMenuBuffer(const char *filename) {
 
1197
        int     len;
 
1198
        fileHandle_t    f;
 
1199
        static char buf[MAX_MENUFILE];
 
1200
 
 
1201
        len = trap_FS_FOpenFile( filename, &f, FS_READ );
 
1202
        if ( !f ) {
 
1203
                trap_Print( va( S_COLOR_RED "menu file not found: %s, using default\n", filename ) );
 
1204
                return NULL;
 
1205
        }
 
1206
        if ( len >= MAX_MENUFILE ) {
 
1207
                trap_Print( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", filename, len, MAX_MENUFILE ) );
 
1208
                trap_FS_FCloseFile( f );
 
1209
                return NULL;
 
1210
        }
 
1211
 
 
1212
        trap_FS_Read( buf, len, f );
 
1213
        buf[len] = 0;
 
1214
        trap_FS_FCloseFile( f );
 
1215
 
 
1216
        return buf;
 
1217
}
 
1218
 
 
1219
//
 
1220
// ==============================
 
1221
// new hud stuff ( mission pack )
 
1222
// ==============================
 
1223
//
 
1224
qboolean CG_Asset_Parse(int handle) {
 
1225
        pc_token_t token;
 
1226
        const char *tempStr;
 
1227
 
 
1228
        if (!trap_PC_ReadToken(handle, &token))
 
1229
                return qfalse;
 
1230
        if (Q_stricmp(token.string, "{") != 0) {
 
1231
                return qfalse;
 
1232
        }
 
1233
    
 
1234
        while ( 1 ) {
 
1235
                if (!trap_PC_ReadToken(handle, &token))
 
1236
                        return qfalse;
 
1237
 
 
1238
                if (Q_stricmp(token.string, "}") == 0) {
 
1239
                        return qtrue;
 
1240
                }
 
1241
 
 
1242
                // font
 
1243
                if (Q_stricmp(token.string, "font") == 0) {
 
1244
                        int pointSize;
 
1245
                        if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
 
1246
                                return qfalse;
 
1247
                        }
 
1248
                        cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont);
 
1249
                        continue;
 
1250
                }
 
1251
 
 
1252
                // smallFont
 
1253
                if (Q_stricmp(token.string, "smallFont") == 0) {
 
1254
                        int pointSize;
 
1255
                        if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
 
1256
                                return qfalse;
 
1257
                        }
 
1258
                        cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont);
 
1259
                        continue;
 
1260
                }
 
1261
 
 
1262
                // font
 
1263
                if (Q_stricmp(token.string, "bigfont") == 0) {
 
1264
                        int pointSize;
 
1265
                        if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
 
1266
                                return qfalse;
 
1267
                        }
 
1268
                        cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont);
 
1269
                        continue;
 
1270
                }
 
1271
 
 
1272
                // gradientbar
 
1273
                if (Q_stricmp(token.string, "gradientbar") == 0) {
 
1274
                        if (!PC_String_Parse(handle, &tempStr)) {
 
1275
                                return qfalse;
 
1276
                        }
 
1277
                        cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr);
 
1278
                        continue;
 
1279
                }
 
1280
 
 
1281
                // enterMenuSound
 
1282
                if (Q_stricmp(token.string, "menuEnterSound") == 0) {
 
1283
                        if (!PC_String_Parse(handle, &tempStr)) {
 
1284
                                return qfalse;
 
1285
                        }
 
1286
                        cgDC.Assets.menuEnterSound = trap_S_RegisterSound( tempStr, qfalse );
 
1287
                        continue;
 
1288
                }
 
1289
 
 
1290
                // exitMenuSound
 
1291
                if (Q_stricmp(token.string, "menuExitSound") == 0) {
 
1292
                        if (!PC_String_Parse(handle, &tempStr)) {
 
1293
                                return qfalse;
 
1294
                        }
 
1295
                        cgDC.Assets.menuExitSound = trap_S_RegisterSound( tempStr, qfalse );
 
1296
                        continue;
 
1297
                }
 
1298
 
 
1299
                // itemFocusSound
 
1300
                if (Q_stricmp(token.string, "itemFocusSound") == 0) {
 
1301
                        if (!PC_String_Parse(handle, &tempStr)) {
 
1302
                                return qfalse;
 
1303
                        }
 
1304
                        cgDC.Assets.itemFocusSound = trap_S_RegisterSound( tempStr, qfalse );
 
1305
                        continue;
 
1306
                }
 
1307
 
 
1308
                // menuBuzzSound
 
1309
                if (Q_stricmp(token.string, "menuBuzzSound") == 0) {
 
1310
                        if (!PC_String_Parse(handle, &tempStr)) {
 
1311
                                return qfalse;
 
1312
                        }
 
1313
                        cgDC.Assets.menuBuzzSound = trap_S_RegisterSound( tempStr, qfalse );
 
1314
                        continue;
 
1315
                }
 
1316
 
 
1317
                if (Q_stricmp(token.string, "cursor") == 0) {
 
1318
                        if (!PC_String_Parse(handle, &cgDC.Assets.cursorStr)) {
 
1319
                                return qfalse;
 
1320
                        }
 
1321
                        cgDC.Assets.cursor = trap_R_RegisterShaderNoMip( cgDC.Assets.cursorStr);
 
1322
                        continue;
 
1323
                }
 
1324
 
 
1325
                if (Q_stricmp(token.string, "fadeClamp") == 0) {
 
1326
                        if (!PC_Float_Parse(handle, &cgDC.Assets.fadeClamp)) {
 
1327
                                return qfalse;
 
1328
                        }
 
1329
                        continue;
 
1330
                }
 
1331
 
 
1332
                if (Q_stricmp(token.string, "fadeCycle") == 0) {
 
1333
                        if (!PC_Int_Parse(handle, &cgDC.Assets.fadeCycle)) {
 
1334
                                return qfalse;
 
1335
                        }
 
1336
                        continue;
 
1337
                }
 
1338
 
 
1339
                if (Q_stricmp(token.string, "fadeAmount") == 0) {
 
1340
                        if (!PC_Float_Parse(handle, &cgDC.Assets.fadeAmount)) {
 
1341
                                return qfalse;
 
1342
                        }
 
1343
                        continue;
 
1344
                }
 
1345
 
 
1346
                if (Q_stricmp(token.string, "shadowX") == 0) {
 
1347
                        if (!PC_Float_Parse(handle, &cgDC.Assets.shadowX)) {
 
1348
                                return qfalse;
 
1349
                        }
 
1350
                        continue;
 
1351
                }
 
1352
 
 
1353
                if (Q_stricmp(token.string, "shadowY") == 0) {
 
1354
                        if (!PC_Float_Parse(handle, &cgDC.Assets.shadowY)) {
 
1355
                                return qfalse;
 
1356
                        }
 
1357
                        continue;
 
1358
                }
 
1359
 
 
1360
                if (Q_stricmp(token.string, "shadowColor") == 0) {
 
1361
                        if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) {
 
1362
                                return qfalse;
 
1363
                        }
 
1364
                        cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[3];
 
1365
                        continue;
 
1366
                }
 
1367
        }
 
1368
        return qfalse; // bk001204 - why not?
 
1369
}
 
1370
 
 
1371
void CG_ParseMenu(const char *menuFile) {
 
1372
        pc_token_t token;
 
1373
        int handle;
 
1374
 
 
1375
        handle = trap_PC_LoadSource(menuFile);
 
1376
        if (!handle)
 
1377
                handle = trap_PC_LoadSource("ui/testhud.menu");
 
1378
        if (!handle)
 
1379
                return;
 
1380
 
 
1381
        while ( 1 ) {
 
1382
                if (!trap_PC_ReadToken( handle, &token )) {
 
1383
                        break;
 
1384
                }
 
1385
 
 
1386
                //if ( Q_stricmp( token, "{" ) ) {
 
1387
                //      Com_Printf( "Missing { in menu file\n" );
 
1388
                //      break;
 
1389
                //}
 
1390
 
 
1391
                //if ( menuCount == MAX_MENUS ) {
 
1392
                //      Com_Printf( "Too many menus!\n" );
 
1393
                //      break;
 
1394
                //}
 
1395
 
 
1396
                if ( token.string[0] == '}' ) {
 
1397
                        break;
 
1398
                }
 
1399
 
 
1400
                if (Q_stricmp(token.string, "assetGlobalDef") == 0) {
 
1401
                        if (CG_Asset_Parse(handle)) {
 
1402
                                continue;
 
1403
                        } else {
 
1404
                                break;
 
1405
                        }
 
1406
                }
 
1407
 
 
1408
 
 
1409
                if (Q_stricmp(token.string, "menudef") == 0) {
 
1410
                        // start a new menu
 
1411
                        Menu_New(handle);
 
1412
                }
 
1413
        }
 
1414
        trap_PC_FreeSource(handle);
 
1415
}
 
1416
 
 
1417
qboolean CG_Load_Menu(char **p) {
 
1418
        char *token;
 
1419
 
 
1420
        token = COM_ParseExt(p, qtrue);
 
1421
 
 
1422
        if (token[0] != '{') {
 
1423
                return qfalse;
 
1424
        }
 
1425
 
 
1426
        while ( 1 ) {
 
1427
 
 
1428
                token = COM_ParseExt(p, qtrue);
 
1429
    
 
1430
                if (Q_stricmp(token, "}") == 0) {
 
1431
                        return qtrue;
 
1432
                }
 
1433
 
 
1434
                if ( !token || token[0] == 0 ) {
 
1435
                        return qfalse;
 
1436
                }
 
1437
 
 
1438
                CG_ParseMenu(token); 
 
1439
        }
 
1440
        return qfalse;
 
1441
}
 
1442
 
 
1443
 
 
1444
 
 
1445
void CG_LoadMenus(const char *menuFile) {
 
1446
        char    *token;
 
1447
        char *p;
 
1448
        int     len, start;
 
1449
        fileHandle_t    f;
 
1450
        static char buf[MAX_MENUDEFFILE];
 
1451
 
 
1452
        start = trap_Milliseconds();
 
1453
 
 
1454
        len = trap_FS_FOpenFile( menuFile, &f, FS_READ );
 
1455
        if ( !f ) {
 
1456
                trap_Error( va( S_COLOR_YELLOW "menu file not found: %s, using default\n", menuFile ) );
 
1457
                len = trap_FS_FOpenFile( "ui/hud.txt", &f, FS_READ );
 
1458
                if (!f) {
 
1459
                        trap_Error( va( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n") );
 
1460
                }
 
1461
        }
 
1462
 
 
1463
        if ( len >= MAX_MENUDEFFILE ) {
 
1464
                trap_Error( va( S_COLOR_RED "menu file too large: %s is %i, max allowed is %i", menuFile, len, MAX_MENUDEFFILE ) );
 
1465
                trap_FS_FCloseFile( f );
 
1466
                return;
 
1467
        }
 
1468
 
 
1469
        trap_FS_Read( buf, len, f );
 
1470
        buf[len] = 0;
 
1471
        trap_FS_FCloseFile( f );
 
1472
        
 
1473
        COM_Compress(buf);
 
1474
 
 
1475
        Menu_Reset();
 
1476
 
 
1477
        p = buf;
 
1478
 
 
1479
        while ( 1 ) {
 
1480
                token = COM_ParseExt( &p, qtrue );
 
1481
                if( !token || token[0] == 0 || token[0] == '}') {
 
1482
                        break;
 
1483
                }
 
1484
 
 
1485
                //if ( Q_stricmp( token, "{" ) ) {
 
1486
                //      Com_Printf( "Missing { in menu file\n" );
 
1487
                //      break;
 
1488
                //}
 
1489
 
 
1490
                //if ( menuCount == MAX_MENUS ) {
 
1491
                //      Com_Printf( "Too many menus!\n" );
 
1492
                //      break;
 
1493
                //}
 
1494
 
 
1495
                if ( Q_stricmp( token, "}" ) == 0 ) {
 
1496
                        break;
 
1497
                }
 
1498
 
 
1499
                if (Q_stricmp(token, "loadmenu") == 0) {
 
1500
                        if (CG_Load_Menu(&p)) {
 
1501
                                continue;
 
1502
                        } else {
 
1503
                                break;
 
1504
                        }
 
1505
                }
 
1506
        }
 
1507
 
 
1508
        Com_Printf("UI menu load time = %d milli seconds\n", trap_Milliseconds() - start);
 
1509
 
 
1510
}
 
1511
 
 
1512
 
 
1513
 
 
1514
static qboolean CG_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) {
 
1515
        return qfalse;
 
1516
}
 
1517
 
 
1518
 
 
1519
static int CG_FeederCount(float feederID) {
 
1520
        int i, count;
 
1521
        count = 0;
 
1522
        if (feederID == FEEDER_REDTEAM_LIST) {
 
1523
                for (i = 0; i < cg.numScores; i++) {
 
1524
                        if (cg.scores[i].team == TEAM_RED) {
 
1525
                                count++;
 
1526
                        }
 
1527
                }
 
1528
        } else if (feederID == FEEDER_BLUETEAM_LIST) {
 
1529
                for (i = 0; i < cg.numScores; i++) {
 
1530
                        if (cg.scores[i].team == TEAM_BLUE) {
 
1531
                                count++;
 
1532
                        }
 
1533
                }
 
1534
        } else if (feederID == FEEDER_SCOREBOARD) {
 
1535
                return cg.numScores;
 
1536
        }
 
1537
        return count;
 
1538
}
 
1539
 
 
1540
 
 
1541
void CG_SetScoreSelection(void *p) {
 
1542
        menuDef_t *menu = (menuDef_t*)p;
 
1543
        playerState_t *ps = &cg.snap->ps;
 
1544
        int i, red, blue;
 
1545
        red = blue = 0;
 
1546
        for (i = 0; i < cg.numScores; i++) {
 
1547
                if (cg.scores[i].team == TEAM_RED) {
 
1548
                        red++;
 
1549
                } else if (cg.scores[i].team == TEAM_BLUE) {
 
1550
                        blue++;
 
1551
                }
 
1552
                if (ps->clientNum == cg.scores[i].client) {
 
1553
                        cg.selectedScore = i;
 
1554
                }
 
1555
        }
 
1556
 
 
1557
        if (menu == NULL) {
 
1558
                // just interested in setting the selected score
 
1559
                return;
 
1560
        }
 
1561
 
 
1562
        if ( cgs.gametype >= GT_TEAM ) {
 
1563
                int feeder = FEEDER_REDTEAM_LIST;
 
1564
                i = red;
 
1565
                if (cg.scores[cg.selectedScore].team == TEAM_BLUE) {
 
1566
                        feeder = FEEDER_BLUETEAM_LIST;
 
1567
                        i = blue;
 
1568
                }
 
1569
                Menu_SetFeederSelection(menu, feeder, i, NULL);
 
1570
        } else {
 
1571
                Menu_SetFeederSelection(menu, FEEDER_SCOREBOARD, cg.selectedScore, NULL);
 
1572
        }
 
1573
}
 
1574
 
 
1575
// FIXME: might need to cache this info
 
1576
static clientInfo_t * CG_InfoFromScoreIndex(int index, int team, int *scoreIndex) {
 
1577
        int i, count;
 
1578
        if ( cgs.gametype >= GT_TEAM ) {
 
1579
                count = 0;
 
1580
                for (i = 0; i < cg.numScores; i++) {
 
1581
                        if (cg.scores[i].team == team) {
 
1582
                                if (count == index) {
 
1583
                                        *scoreIndex = i;
 
1584
                                        return &cgs.clientinfo[cg.scores[i].client];
 
1585
                                }
 
1586
                                count++;
 
1587
                        }
 
1588
                }
 
1589
        }
 
1590
        *scoreIndex = index;
 
1591
        return &cgs.clientinfo[ cg.scores[index].client ];
 
1592
}
 
1593
 
 
1594
static const char *CG_FeederItemText(float feederID, int index, int column, qhandle_t *handle) {
 
1595
        gitem_t *item;
 
1596
        int scoreIndex = 0;
 
1597
        clientInfo_t *info = NULL;
 
1598
        int team = -1;
 
1599
        score_t *sp = NULL;
 
1600
 
 
1601
        *handle = -1;
 
1602
 
 
1603
        if (feederID == FEEDER_REDTEAM_LIST) {
 
1604
                team = TEAM_RED;
 
1605
        } else if (feederID == FEEDER_BLUETEAM_LIST) {
 
1606
                team = TEAM_BLUE;
 
1607
        }
 
1608
 
 
1609
        info = CG_InfoFromScoreIndex(index, team, &scoreIndex);
 
1610
        sp = &cg.scores[scoreIndex];
 
1611
 
 
1612
        if (info && info->infoValid) {
 
1613
                switch (column) {
 
1614
                        case 0:
 
1615
                                if ( info->powerups & ( 1 << PW_NEUTRALFLAG ) ) {
 
1616
                                        item = BG_FindItemForPowerup( PW_NEUTRALFLAG );
 
1617
                                        *handle = cg_items[ ITEM_INDEX(item) ].icon;
 
1618
                                } else if ( info->powerups & ( 1 << PW_REDFLAG ) ) {
 
1619
                                        item = BG_FindItemForPowerup( PW_REDFLAG );
 
1620
                                        *handle = cg_items[ ITEM_INDEX(item) ].icon;
 
1621
                                } else if ( info->powerups & ( 1 << PW_BLUEFLAG ) ) {
 
1622
                                        item = BG_FindItemForPowerup( PW_BLUEFLAG );
 
1623
                                        *handle = cg_items[ ITEM_INDEX(item) ].icon;
 
1624
                                } else {
 
1625
                                        if ( info->botSkill > 0 && info->botSkill <= 5 ) {
 
1626
                                                *handle = cgs.media.botSkillShaders[ info->botSkill - 1 ];
 
1627
                                        } else if ( info->handicap < 100 ) {
 
1628
                                        return va("%i", info->handicap );
 
1629
                                        }
 
1630
                                }
 
1631
                        break;
 
1632
                        case 1:
 
1633
                                if (team == -1) {
 
1634
                                        return "";
 
1635
                                } else {
 
1636
                                        *handle = CG_StatusHandle(info->teamTask);
 
1637
                                }
 
1638
                  break;
 
1639
                        case 2:
 
1640
                                if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << sp->client ) ) {
 
1641
                                        return "Ready";
 
1642
                                }
 
1643
                                if (team == -1) {
 
1644
                                        if (cgs.gametype == GT_TOURNAMENT) {
 
1645
                                                return va("%i/%i", info->wins, info->losses);
 
1646
                                        } else if (info->infoValid && info->team == TEAM_SPECTATOR ) {
 
1647
                                                return "Spectator";
 
1648
                                        } else {
 
1649
                                                return "";
 
1650
                                        }
 
1651
                                } else {
 
1652
                                        if (info->teamLeader) {
 
1653
                                                return "Leader";
 
1654
                                        }
 
1655
                                }
 
1656
                        break;
 
1657
                        case 3:
 
1658
                                return info->name;
 
1659
                        break;
 
1660
                        case 4:
 
1661
                                return va("%i", info->score);
 
1662
                        break;
 
1663
                        case 5:
 
1664
                                return va("%4i", sp->time);
 
1665
                        break;
 
1666
                        case 6:
 
1667
                                if ( sp->ping == -1 ) {
 
1668
                                        return "connecting";
 
1669
                                } 
 
1670
                                return va("%4i", sp->ping);
 
1671
                        break;
 
1672
                }
 
1673
        }
 
1674
 
 
1675
        return "";
 
1676
}
 
1677
 
 
1678
static qhandle_t CG_FeederItemImage(float feederID, int index) {
 
1679
        return 0;
 
1680
}
 
1681
 
 
1682
static void CG_FeederSelection(float feederID, int index) {
 
1683
        if ( cgs.gametype >= GT_TEAM ) {
 
1684
                int i, count;
 
1685
                int team = (feederID == FEEDER_REDTEAM_LIST) ? TEAM_RED : TEAM_BLUE;
 
1686
                count = 0;
 
1687
                for (i = 0; i < cg.numScores; i++) {
 
1688
                        if (cg.scores[i].team == team) {
 
1689
                                if (index == count) {
 
1690
                                        cg.selectedScore = i;
 
1691
                                }
 
1692
                                count++;
 
1693
                        }
 
1694
                }
 
1695
        } else {
 
1696
                cg.selectedScore = index;
 
1697
        }
 
1698
}
 
1699
#endif
 
1700
 
 
1701
#ifdef MISSIONPACK // bk001204 - only needed there
 
1702
static float CG_Cvar_Get(const char *cvar) {
 
1703
        char buff[128];
 
1704
        memset(buff, 0, sizeof(buff));
 
1705
        trap_Cvar_VariableStringBuffer(cvar, buff, sizeof(buff));
 
1706
        return atof(buff);
 
1707
}
 
1708
#endif
 
1709
 
 
1710
#ifdef MISSIONPACK
 
1711
void CG_Text_PaintWithCursor(float x, float y, float scale, vec4_t color, const char *text, int cursorPos, char cursor, int limit, int style) {
 
1712
        CG_Text_Paint(x, y, scale, color, text, 0, limit, style);
 
1713
}
 
1714
 
 
1715
static int CG_OwnerDrawWidth(int ownerDraw, float scale) {
 
1716
        switch (ownerDraw) {
 
1717
          case CG_GAME_TYPE:
 
1718
                        return CG_Text_Width(CG_GameTypeString(), scale, 0);
 
1719
          case CG_GAME_STATUS:
 
1720
                        return CG_Text_Width(CG_GetGameStatusText(), scale, 0);
 
1721
                        break;
 
1722
          case CG_KILLER:
 
1723
                        return CG_Text_Width(CG_GetKillerText(), scale, 0);
 
1724
                        break;
 
1725
          case CG_RED_NAME:
 
1726
                        return CG_Text_Width(cg_redTeamName.string, scale, 0);
 
1727
                        break;
 
1728
          case CG_BLUE_NAME:
 
1729
                        return CG_Text_Width(cg_blueTeamName.string, scale, 0);
 
1730
                        break;
 
1731
 
 
1732
 
 
1733
        }
 
1734
        return 0;
 
1735
}
 
1736
 
 
1737
static int CG_PlayCinematic(const char *name, float x, float y, float w, float h) {
 
1738
  return trap_CIN_PlayCinematic(name, x, y, w, h, CIN_loop);
 
1739
}
 
1740
 
 
1741
static void CG_StopCinematic(int handle) {
 
1742
  trap_CIN_StopCinematic(handle);
 
1743
}
 
1744
 
 
1745
static void CG_DrawCinematic(int handle, float x, float y, float w, float h) {
 
1746
  trap_CIN_SetExtents(handle, x, y, w, h);
 
1747
  trap_CIN_DrawCinematic(handle);
 
1748
}
 
1749
 
 
1750
static void CG_RunCinematicFrame(int handle) {
 
1751
  trap_CIN_RunCinematic(handle);
 
1752
}
 
1753
 
 
1754
/*
 
1755
=================
 
1756
CG_LoadHudMenu();
 
1757
 
 
1758
=================
 
1759
*/
 
1760
void CG_LoadHudMenu( void ) {
 
1761
        char buff[1024];
 
1762
        const char *hudSet;
 
1763
 
 
1764
        cgDC.registerShaderNoMip = &trap_R_RegisterShaderNoMip;
 
1765
        cgDC.setColor = &trap_R_SetColor;
 
1766
        cgDC.drawHandlePic = &CG_DrawPic;
 
1767
        cgDC.drawStretchPic = &trap_R_DrawStretchPic;
 
1768
        cgDC.drawText = &CG_Text_Paint;
 
1769
        cgDC.textWidth = &CG_Text_Width;
 
1770
        cgDC.textHeight = &CG_Text_Height;
 
1771
        cgDC.registerModel = &trap_R_RegisterModel;
 
1772
        cgDC.modelBounds = &trap_R_ModelBounds;
 
1773
        cgDC.fillRect = &CG_FillRect;
 
1774
        cgDC.drawRect = &CG_DrawRect;   
 
1775
        cgDC.drawSides = &CG_DrawSides;
 
1776
        cgDC.drawTopBottom = &CG_DrawTopBottom;
 
1777
        cgDC.clearScene = &trap_R_ClearScene;
 
1778
        cgDC.addRefEntityToScene = &trap_R_AddRefEntityToScene;
 
1779
        cgDC.renderScene = &trap_R_RenderScene;
 
1780
        cgDC.registerFont = &trap_R_RegisterFont;
 
1781
        cgDC.ownerDrawItem = &CG_OwnerDraw;
 
1782
        cgDC.getValue = &CG_GetValue;
 
1783
        cgDC.ownerDrawVisible = &CG_OwnerDrawVisible;
 
1784
        cgDC.runScript = &CG_RunMenuScript;
 
1785
        cgDC.getTeamColor = &CG_GetTeamColor;
 
1786
        cgDC.setCVar = trap_Cvar_Set;
 
1787
        cgDC.getCVarString = trap_Cvar_VariableStringBuffer;
 
1788
        cgDC.getCVarValue = CG_Cvar_Get;
 
1789
        cgDC.drawTextWithCursor = &CG_Text_PaintWithCursor;
 
1790
        //cgDC.setOverstrikeMode = &trap_Key_SetOverstrikeMode;
 
1791
        //cgDC.getOverstrikeMode = &trap_Key_GetOverstrikeMode;
 
1792
        cgDC.startLocalSound = &trap_S_StartLocalSound;
 
1793
        cgDC.ownerDrawHandleKey = &CG_OwnerDrawHandleKey;
 
1794
        cgDC.feederCount = &CG_FeederCount;
 
1795
        cgDC.feederItemImage = &CG_FeederItemImage;
 
1796
        cgDC.feederItemText = &CG_FeederItemText;
 
1797
        cgDC.feederSelection = &CG_FeederSelection;
 
1798
        //cgDC.setBinding = &trap_Key_SetBinding;
 
1799
        //cgDC.getBindingBuf = &trap_Key_GetBindingBuf;
 
1800
        //cgDC.keynumToStringBuf = &trap_Key_KeynumToStringBuf;
 
1801
        //cgDC.executeText = &trap_Cmd_ExecuteText;
 
1802
        cgDC.Error = &Com_Error; 
 
1803
        cgDC.Print = &Com_Printf; 
 
1804
        cgDC.ownerDrawWidth = &CG_OwnerDrawWidth;
 
1805
        //cgDC.Pause = &CG_Pause;
 
1806
        cgDC.registerSound = &trap_S_RegisterSound;
 
1807
        cgDC.startBackgroundTrack = &trap_S_StartBackgroundTrack;
 
1808
        cgDC.stopBackgroundTrack = &trap_S_StopBackgroundTrack;
 
1809
        cgDC.playCinematic = &CG_PlayCinematic;
 
1810
        cgDC.stopCinematic = &CG_StopCinematic;
 
1811
        cgDC.drawCinematic = &CG_DrawCinematic;
 
1812
        cgDC.runCinematicFrame = &CG_RunCinematicFrame;
 
1813
        
 
1814
        Init_Display(&cgDC);
 
1815
 
 
1816
        Menu_Reset();
 
1817
        
 
1818
        trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff));
 
1819
        hudSet = buff;
 
1820
        if (hudSet[0] == '\0') {
 
1821
                hudSet = "ui/hud.txt";
 
1822
        }
 
1823
 
 
1824
        CG_LoadMenus(hudSet);
 
1825
}
 
1826
 
 
1827
void CG_AssetCache( void ) {
 
1828
        //if (Assets.textFont == NULL) {
 
1829
        //  trap_R_RegisterFont("fonts/arial.ttf", 72, &Assets.textFont);
 
1830
        //}
 
1831
        //Assets.background = trap_R_RegisterShaderNoMip( ASSET_BACKGROUND );
 
1832
        //Com_Printf("Menu Size: %i bytes\n", sizeof(Menus));
 
1833
        cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip( ASSET_GRADIENTBAR );
 
1834
        cgDC.Assets.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE );
 
1835
        cgDC.Assets.fxPic[0] = trap_R_RegisterShaderNoMip( ART_FX_RED );
 
1836
        cgDC.Assets.fxPic[1] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW );
 
1837
        cgDC.Assets.fxPic[2] = trap_R_RegisterShaderNoMip( ART_FX_GREEN );
 
1838
        cgDC.Assets.fxPic[3] = trap_R_RegisterShaderNoMip( ART_FX_TEAL );
 
1839
        cgDC.Assets.fxPic[4] = trap_R_RegisterShaderNoMip( ART_FX_BLUE );
 
1840
        cgDC.Assets.fxPic[5] = trap_R_RegisterShaderNoMip( ART_FX_CYAN );
 
1841
        cgDC.Assets.fxPic[6] = trap_R_RegisterShaderNoMip( ART_FX_WHITE );
 
1842
        cgDC.Assets.scrollBar = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR );
 
1843
        cgDC.Assets.scrollBarArrowDown = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWDOWN );
 
1844
        cgDC.Assets.scrollBarArrowUp = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWUP );
 
1845
        cgDC.Assets.scrollBarArrowLeft = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWLEFT );
 
1846
        cgDC.Assets.scrollBarArrowRight = trap_R_RegisterShaderNoMip( ASSET_SCROLLBAR_ARROWRIGHT );
 
1847
        cgDC.Assets.scrollBarThumb = trap_R_RegisterShaderNoMip( ASSET_SCROLL_THUMB );
 
1848
        cgDC.Assets.sliderBar = trap_R_RegisterShaderNoMip( ASSET_SLIDER_BAR );
 
1849
        cgDC.Assets.sliderThumb = trap_R_RegisterShaderNoMip( ASSET_SLIDER_THUMB );
 
1850
}
 
1851
#endif
 
1852
/*
 
1853
=================
 
1854
CG_Init
 
1855
 
 
1856
Called after every level change or subsystem restart
 
1857
Will perform callbacks to make the loading info screen update.
 
1858
=================
 
1859
*/
 
1860
void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) {
 
1861
        const char      *s;
 
1862
 
 
1863
        // clear everything
 
1864
        memset( &cgs, 0, sizeof( cgs ) );
 
1865
        memset( &cg, 0, sizeof( cg ) );
 
1866
        memset( cg_entities, 0, sizeof(cg_entities) );
 
1867
        memset( cg_weapons, 0, sizeof(cg_weapons) );
 
1868
        memset( cg_items, 0, sizeof(cg_items) );
 
1869
 
 
1870
        cg.clientNum = clientNum;
 
1871
 
 
1872
        cgs.processedSnapshotNum = serverMessageNum;
 
1873
        cgs.serverCommandSequence = serverCommandSequence;
 
1874
 
 
1875
        // load a few needed things before we do any screen updates
 
1876
        cgs.media.charsetShader         = trap_R_RegisterShader( "gfx/2d/bigchars" );
 
1877
        cgs.media.whiteShader           = trap_R_RegisterShader( "white" );
 
1878
        cgs.media.charsetProp           = trap_R_RegisterShaderNoMip( "menu/art/font1_prop.tga" );
 
1879
        cgs.media.charsetPropGlow       = trap_R_RegisterShaderNoMip( "menu/art/font1_prop_glo.tga" );
 
1880
        cgs.media.charsetPropB          = trap_R_RegisterShaderNoMip( "menu/art/font2_prop.tga" );
 
1881
 
 
1882
        CG_RegisterCvars();
 
1883
 
 
1884
        CG_InitConsoleCommands();
 
1885
 
 
1886
        cg.weaponSelect = WP_MACHINEGUN;
 
1887
 
 
1888
        cgs.redflag = cgs.blueflag = -1; // For compatibily, default to unset for
 
1889
        cgs.flagStatus = -1;
 
1890
        // old servers
 
1891
 
 
1892
        // get the rendering configuration from the client system
 
1893
        trap_GetGlconfig( &cgs.glconfig );
 
1894
        cgs.screenXScale = cgs.glconfig.vidWidth / 640.0;
 
1895
        cgs.screenYScale = cgs.glconfig.vidHeight / 480.0;
 
1896
 
 
1897
        // get the gamestate from the client system
 
1898
        trap_GetGameState( &cgs.gameState );
 
1899
 
 
1900
        // check version
 
1901
        s = CG_ConfigString( CS_GAME_VERSION );
 
1902
        if ( strcmp( s, GAME_VERSION ) ) {
 
1903
                CG_Error( "Client/Server game mismatch: %s/%s", GAME_VERSION, s );
 
1904
        }
 
1905
 
 
1906
        s = CG_ConfigString( CS_LEVEL_START_TIME );
 
1907
        cgs.levelStartTime = atoi( s );
 
1908
 
 
1909
        CG_ParseServerinfo();
 
1910
 
 
1911
        // load the new map
 
1912
        CG_LoadingString( "collision map" );
 
1913
 
 
1914
        trap_CM_LoadMap( cgs.mapname );
 
1915
 
 
1916
#ifdef MISSIONPACK
 
1917
        String_Init();
 
1918
#endif
 
1919
 
 
1920
        cg.loading = qtrue;             // force players to load instead of defer
 
1921
 
 
1922
        CG_LoadingString( "sounds" );
 
1923
 
 
1924
        CG_RegisterSounds();
 
1925
 
 
1926
        CG_LoadingString( "graphics" );
 
1927
 
 
1928
        CG_RegisterGraphics();
 
1929
 
 
1930
        CG_LoadingString( "clients" );
 
1931
 
 
1932
        CG_RegisterClients();           // if low on memory, some clients will be deferred
 
1933
 
 
1934
#ifdef MISSIONPACK
 
1935
        CG_AssetCache();
 
1936
        CG_LoadHudMenu();      // load new hud stuff
 
1937
#endif
 
1938
 
 
1939
        cg.loading = qfalse;    // future players will be deferred
 
1940
 
 
1941
        CG_InitLocalEntities();
 
1942
 
 
1943
        CG_InitMarkPolys();
 
1944
 
 
1945
        // remove the last loading update
 
1946
        cg.infoScreenText[0] = 0;
 
1947
 
 
1948
        // Make sure we have update values (scores)
 
1949
        CG_SetConfigValues();
 
1950
 
 
1951
        CG_StartMusic();
 
1952
 
 
1953
        CG_LoadingString( "" );
 
1954
 
 
1955
#ifdef MISSIONPACK
 
1956
        CG_InitTeamChat();
 
1957
#endif
 
1958
 
 
1959
        CG_ShaderStateChanged();
 
1960
 
 
1961
        trap_S_ClearLoopingSounds( qtrue );
 
1962
}
 
1963
 
 
1964
/*
 
1965
=================
 
1966
CG_Shutdown
 
1967
 
 
1968
Called before every level change or subsystem restart
 
1969
=================
 
1970
*/
 
1971
void CG_Shutdown( void ) {
 
1972
        // some mods may need to do cleanup work here,
 
1973
        // like closing files or archiving session data
 
1974
}
 
1975
 
 
1976
 
 
1977
/*
 
1978
==================
 
1979
CG_EventHandling
 
1980
==================
 
1981
 type 0 - no event handling
 
1982
      1 - team menu
 
1983
      2 - hud editor
 
1984
 
 
1985
*/
 
1986
#ifndef MISSIONPACK
 
1987
void CG_EventHandling(int type) {
 
1988
}
 
1989
 
 
1990
 
 
1991
 
 
1992
void CG_KeyEvent(int key, qboolean down) {
 
1993
}
 
1994
 
 
1995
void CG_MouseEvent(int x, int y) {
 
1996
}
 
1997
#endif
 
1998