2
===========================================================================
3
Copyright (C) 1999-2005 Id Software, Inc.
5
This file is part of Quake III Arena source code.
7
Quake III Arena source code is free software; you can redistribute it
8
and/or modify it under the terms of the GNU General Public License as
9
published by the Free Software Foundation; either version 2 of the License,
10
or (at your option) any later version.
12
Quake III Arena source code is distributed in the hope that it will be
13
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
17
You should have received a copy of the GNU General Public License
18
along with Quake III Arena source code; if not, write to the Free Software
19
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
===========================================================================
23
// cg_main.c -- initialization and primary entry point for cgame
27
#include "../ui/ui_shared.h"
28
// display context for new ui stuff
29
displayContextDef_t cgDC;
32
int forceModelModificationCount = -1;
34
void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum );
35
void CG_Shutdown( void );
42
This is the only way control passes into the module.
43
This must be the very first function compiled into the .q3vm file
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 ) {
50
CG_Init( arg0, arg1, arg2 );
55
case CG_CONSOLE_COMMAND:
56
return CG_ConsoleCommand();
57
case CG_DRAW_ACTIVE_FRAME:
58
CG_DrawActiveFrame( arg0, arg1, arg2 );
60
case CG_CROSSHAIR_PLAYER:
61
return CG_CrosshairPlayer();
62
case CG_LAST_ATTACKER:
63
return CG_LastAttacker();
65
CG_KeyEvent(arg0, arg1);
69
cgDC.cursorx = cgs.cursorX;
70
cgDC.cursory = cgs.cursorY;
72
CG_MouseEvent(arg0, arg1);
74
case CG_EVENT_HANDLING:
75
CG_EventHandling(arg0);
78
CG_Error( "vmMain: unknown command %i", command );
87
centity_t cg_entities[MAX_GENTITIES];
88
weaponInfo_t cg_weapons[MAX_WEAPONS];
89
itemInfo_t cg_items[MAX_ITEMS];
92
vmCvar_t cg_railTrailTime;
93
vmCvar_t cg_centertime;
99
vmCvar_t cg_swingSpeed;
102
vmCvar_t cg_drawTimer;
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;
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;
130
vmCvar_t cg_gun_frame;
134
vmCvar_t cg_tracerChance;
135
vmCvar_t cg_tracerWidth;
136
vmCvar_t cg_tracerLength;
137
vmCvar_t cg_autoswitch;
139
vmCvar_t cg_simpleItems;
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;
152
vmCvar_t cg_buildScript;
153
vmCvar_t cg_forceModel;
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;
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;
180
vmCvar_t cg_noProjectileTrail;
182
vmCvar_t cg_oldRocket;
183
vmCvar_t cg_oldPlasma;
184
vmCvar_t cg_trueLightning;
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;
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 },
269
{ &cg_deferPlayers, "cg_deferPlayers", "0", CVAR_ARCHIVE },
271
{ &cg_deferPlayers, "cg_deferPlayers", "1", CVAR_ARCHIVE },
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 },
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},
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},
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 }
329
static int cvarTableSize = sizeof( cvarTable ) / sizeof( cvarTable[0] );
336
void CG_RegisterCvars( void ) {
339
char var[MAX_TOKEN_CHARS];
341
for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) {
342
trap_Cvar_Register( cv->vmCvar, cv->cvarName,
343
cv->defaultString, cv->cvarFlags );
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 );
350
forceModelModificationCount = cg_forceModel.modificationCount;
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 );
363
static void CG_ForceModelChange( void ) {
366
for (i=0 ; i<MAX_CLIENTS ; i++) {
367
const char *clientInfo;
369
clientInfo = CG_ConfigString( CS_PLAYERS+i );
370
if ( !clientInfo[0] ) {
373
CG_NewClientInfo( i );
382
void CG_UpdateCvars( void ) {
386
for ( i = 0, cv = cvarTable ; i < cvarTableSize ; i++, cv++ ) {
387
trap_Cvar_Update( cv->vmCvar );
390
// check for modications here
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;
397
if ( cg_drawTeamOverlay.integer > 0 ) {
398
trap_Cvar_Set( "teamoverlay", "1" );
400
trap_Cvar_Set( "teamoverlay", "0" );
404
// if force model changed
405
if ( forceModelModificationCount != cg_forceModel.modificationCount ) {
406
forceModelModificationCount = cg_forceModel.modificationCount;
407
CG_ForceModelChange();
411
int CG_CrosshairPlayer( void ) {
412
if ( cg.time > ( cg.crosshairClientTime + 1000 ) ) {
415
return cg.crosshairClientNum;
418
int CG_LastAttacker( void ) {
419
if ( !cg.attackerTime ) {
422
return cg.snap->ps.persistant[PERS_ATTACKER];
425
void QDECL CG_Printf( const char *msg, ... ) {
429
va_start (argptr, msg);
430
vsprintf (text, msg, argptr);
436
void QDECL CG_Error( const char *msg, ... ) {
440
va_start (argptr, msg);
441
vsprintf (text, msg, argptr);
447
void QDECL Com_Error( int level, const char *error, ... ) {
451
va_start (argptr, error);
452
vsprintf (text, error, argptr);
455
CG_Error( "%s", text);
458
void QDECL Com_Printf( const char *msg, ... ) {
462
va_start (argptr, msg);
463
vsprintf (text, msg, argptr);
466
CG_Printf ("%s", text);
474
const char *CG_Argv( int arg ) {
475
static char buffer[MAX_STRING_CHARS];
477
trap_Argv( arg, buffer, sizeof( buffer ) );
483
//========================================================================
487
CG_RegisterItemSounds
489
The server says this item is used on this level
492
static void CG_RegisterItemSounds( int itemNum ) {
494
char data[MAX_QPATH];
498
item = &bg_itemlist[ itemNum ];
500
if( item->pickup_sound ) {
501
trap_S_RegisterSound( item->pickup_sound, qfalse );
504
// parse the space seperated precache string for other media
511
while (*s && *s != ' ') {
516
if (len >= MAX_QPATH || len < 5) {
517
CG_Error( "PrecacheItem: %s has bad precache string",
521
memcpy (data, start, len);
527
if ( !strcmp(data+len-3, "wav" )) {
528
trap_S_RegisterSound( data, qfalse );
538
called during a precache command
541
static void CG_RegisterSounds( void ) {
543
char items[MAX_ITEMS+1];
544
char name[MAX_QPATH];
545
const char *soundName;
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 );
564
cgs.media.countPrepareTeamSound = trap_S_RegisterSound( "sound/feedback/prepare_team.wav", qtrue );
567
if ( cgs.gametype >= GT_TEAM || cg_buildScript.integer ) {
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 );
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 );
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 );
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 );
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 );
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 );
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 );
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);
607
if ( cgs.gametype == GT_OBELISK || cg_buildScript.integer ) {
608
cgs.media.yourBaseIsUnderAttackSound = trap_S_RegisterSound( "sound/teamplay/voc_base_attack.wav", qtrue );
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 );
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 );
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 );
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);
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 );
649
cgs.media.noAmmoSound = trap_S_RegisterSound( "sound/weapons/noammo.wav", qfalse );
651
cgs.media.talkSound = trap_S_RegisterSound( "sound/player/talk.wav", qfalse );
652
cgs.media.landSound = trap_S_RegisterSound( "sound/player/land1.wav", qfalse);
654
cgs.media.hitSound = trap_S_RegisterSound( "sound/feedback/hit.wav", qfalse );
656
cgs.media.hitSoundHighArmor = trap_S_RegisterSound( "sound/feedback/hithi.wav", qfalse );
657
cgs.media.hitSoundLowArmor = trap_S_RegisterSound( "sound/feedback/hitlo.wav", qfalse );
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 );
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 );
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);
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);
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);
686
cgs.media.jumpPadSound = trap_S_RegisterSound ("sound/world/jumppad.wav", qfalse );
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);
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);
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);
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);
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);
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);
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);
711
// only register the items that the server says we need
712
Q_strncpyz(items, CG_ConfigString(CS_ITEMS), sizeof(items));
714
for ( i = 1 ; i < bg_numItems ; i++ ) {
715
// if ( items[ i ] == '1' || cg_buildScript.integer ) {
716
CG_RegisterItemSounds( i );
720
for ( i = 1 ; i < MAX_SOUNDS ; i++ ) {
721
soundName = CG_ConfigString( CS_SOUNDS+i );
722
if ( !soundName[0] ) {
725
if ( soundName[0] == '*' ) {
726
continue; // custom sound
728
cgs.gameSounds[i] = trap_S_RegisterSound( soundName, qfalse );
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);
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 );
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);
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);
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 );
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 );
800
//===================================================================================
807
This function may execute for a couple of minutes with a slow disk.
810
static void CG_RegisterGraphics( void ) {
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",
827
// clear any references to old media
828
memset( &cg.refdef, 0, sizeof( cg.refdef ) );
831
CG_LoadingString( cgs.mapname );
833
trap_R_LoadWorldMap( cgs.mapname );
835
// precache status bar pics
836
CG_LoadingString( "game media" );
838
for ( i=0 ; i<11 ; i++) {
839
cgs.media.numberShaders[i] = trap_R_RegisterShader( sb_nums[i] );
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" );
848
cgs.media.viewBloodShader = trap_R_RegisterShader( "viewBloodBlend" );
850
cgs.media.deferShader = trap_R_RegisterShaderNoMip( "gfx/2d/defer.tga" );
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" );
857
cgs.media.smokePuffShader = trap_R_RegisterShader( "smokePuff" );
858
cgs.media.smokePuffRageProShader = trap_R_RegisterShader( "smokePuffRagePro" );
859
cgs.media.shotgunSmokePuffShader = trap_R_RegisterShader( "shotgunSmokePuff" );
861
cgs.media.nailPuffShader = trap_R_RegisterShader( "nailtrail" );
862
cgs.media.blueProxMine = trap_R_RegisterModel( "models/weaphits/proxmineb.md3" );
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" );
869
cgs.media.waterBubbleShader = trap_R_RegisterShader( "waterBubble" );
871
cgs.media.tracerShader = trap_R_RegisterShader( "gfx/misc/tracer" );
872
cgs.media.selectShader = trap_R_RegisterShader( "gfx/2d/select" );
874
for ( i = 0 ; i < NUM_CROSSHAIRS ; i++ ) {
875
cgs.media.crosshairShader[i] = trap_R_RegisterShader( va("gfx/2d/crosshair%c", 'a'+i) );
878
cgs.media.backTileShader = trap_R_RegisterShader( "gfx/2d/backtile" );
879
cgs.media.noammoShader = trap_R_RegisterShader( "icons/noammo" );
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" );
891
if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) {
893
if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) {
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" );
902
if ( cgs.gametype == GT_CTF || cgs.gametype == GT_1FCTF || cgs.gametype == GT_HARVESTER || cg_buildScript.integer ) {
904
if ( cgs.gametype == GT_CTF || cg_buildScript.integer ) {
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" );
915
cgs.media.flagPoleModel = trap_R_RegisterModel( "models/flag2/flagpole.md3" );
916
cgs.media.flagFlapModel = trap_R_RegisterModel( "models/flag2/flagflap3.md3" );
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" );
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" );
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" );
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" );
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" );
951
cgs.media.redKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikred" );
952
cgs.media.dustPuffShader = trap_R_RegisterShader("hasteSmokePuff" );
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" );
960
cgs.media.blueKamikazeShader = trap_R_RegisterShader( "models/weaphits/kamikblu" );
964
cgs.media.armorModel = trap_R_RegisterModel( "models/powerups/armor/armor_yel.md3" );
965
cgs.media.armorIcon = trap_R_RegisterShaderNoMip( "icons/iconr_yellow" );
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" );
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" );
981
cgs.media.smoke2 = trap_R_RegisterModel( "models/weapons2/shells/s_shell.md3" );
983
cgs.media.balloonShader = trap_R_RegisterShader( "sprites/balloon3" );
985
cgs.media.bloodExplosionShader = trap_R_RegisterShader( "bloodExplosion" );
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");
991
cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/powerups/pop.md3" );
993
cgs.media.teleportEffectModel = trap_R_RegisterModel( "models/misc/telep.md3" );
994
cgs.media.teleportEffectShader = trap_R_RegisterShader( "teleportEffect" );
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" );
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" );
1021
memset( cg_items, 0, sizeof( cg_items ) );
1022
memset( cg_weapons, 0, sizeof( cg_weapons ) );
1024
// only register the items that the server says we need
1025
Q_strncpyz(items, CG_ConfigString(CS_ITEMS), sizeof(items));
1027
for ( i = 1 ; i < bg_numItems ; i++ ) {
1028
if ( items[ i ] == '1' || cg_buildScript.integer ) {
1029
CG_LoadingItem( i );
1030
CG_RegisterItemVisuals( i );
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" );
1043
// register the inline models
1044
cgs.numInlineModels = trap_CM_NumInlineModels();
1045
for ( i = 1 ; i < cgs.numInlineModels ; i++ ) {
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] );
1058
// register all the server specified models
1059
for (i=1 ; i<MAX_MODELS ; i++) {
1060
const char *modelName;
1062
modelName = CG_ConfigString( CS_MODELS+i );
1063
if ( !modelName[0] ) {
1066
cgs.gameModels[i] = trap_R_RegisterModel( modelName );
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");
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" );
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" );
1095
CG_ClearParticles ();
1097
for (i=1; i<MAX_PARTICLES_AREAS; i++)
1102
rval = CG_NewParticleArea ( CS_PARTICLES + i);
1113
=======================
1114
CG_BuildSpectatorString
1116
=======================
1118
void CG_BuildSpectatorString(void) {
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));
1126
i = strlen(cg.spectatorList);
1127
if (i != cg.spectatorLen) {
1128
cg.spectatorLen = i;
1129
cg.spectatorWidth = -1;
1139
static void CG_RegisterClients( void ) {
1142
CG_LoadingClient(cg.clientNum);
1143
CG_NewClientInfo(cg.clientNum);
1145
for (i=0 ; i<MAX_CLIENTS ; i++) {
1146
const char *clientInfo;
1148
if (cg.clientNum == i) {
1152
clientInfo = CG_ConfigString( CS_PLAYERS+i );
1153
if ( !clientInfo[0]) {
1156
CG_LoadingClient( i );
1157
CG_NewClientInfo( i );
1159
CG_BuildSpectatorString();
1162
//===========================================================================
1169
const char *CG_ConfigString( int index ) {
1170
if ( index < 0 || index >= MAX_CONFIGSTRINGS ) {
1171
CG_Error( "CG_ConfigString: bad index: %i", index );
1173
return cgs.gameState.stringData + cgs.gameState.stringOffsets[ index ];
1176
//==================================================================
1179
======================
1182
======================
1184
void CG_StartMusic( void ) {
1186
char parm1[MAX_QPATH], parm2[MAX_QPATH];
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 ) );
1193
trap_S_StartBackgroundTrack( parm1, parm2 );
1196
char *CG_GetMenuBuffer(const char *filename) {
1199
static char buf[MAX_MENUFILE];
1201
len = trap_FS_FOpenFile( filename, &f, FS_READ );
1203
trap_Print( va( S_COLOR_RED "menu file not found: %s, using default\n", filename ) );
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 );
1212
trap_FS_Read( buf, len, f );
1214
trap_FS_FCloseFile( f );
1220
// ==============================
1221
// new hud stuff ( mission pack )
1222
// ==============================
1224
qboolean CG_Asset_Parse(int handle) {
1226
const char *tempStr;
1228
if (!trap_PC_ReadToken(handle, &token))
1230
if (Q_stricmp(token.string, "{") != 0) {
1235
if (!trap_PC_ReadToken(handle, &token))
1238
if (Q_stricmp(token.string, "}") == 0) {
1243
if (Q_stricmp(token.string, "font") == 0) {
1245
if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
1248
cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.textFont);
1253
if (Q_stricmp(token.string, "smallFont") == 0) {
1255
if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
1258
cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.smallFont);
1263
if (Q_stricmp(token.string, "bigfont") == 0) {
1265
if (!PC_String_Parse(handle, &tempStr) || !PC_Int_Parse(handle, &pointSize)) {
1268
cgDC.registerFont(tempStr, pointSize, &cgDC.Assets.bigFont);
1273
if (Q_stricmp(token.string, "gradientbar") == 0) {
1274
if (!PC_String_Parse(handle, &tempStr)) {
1277
cgDC.Assets.gradientBar = trap_R_RegisterShaderNoMip(tempStr);
1282
if (Q_stricmp(token.string, "menuEnterSound") == 0) {
1283
if (!PC_String_Parse(handle, &tempStr)) {
1286
cgDC.Assets.menuEnterSound = trap_S_RegisterSound( tempStr, qfalse );
1291
if (Q_stricmp(token.string, "menuExitSound") == 0) {
1292
if (!PC_String_Parse(handle, &tempStr)) {
1295
cgDC.Assets.menuExitSound = trap_S_RegisterSound( tempStr, qfalse );
1300
if (Q_stricmp(token.string, "itemFocusSound") == 0) {
1301
if (!PC_String_Parse(handle, &tempStr)) {
1304
cgDC.Assets.itemFocusSound = trap_S_RegisterSound( tempStr, qfalse );
1309
if (Q_stricmp(token.string, "menuBuzzSound") == 0) {
1310
if (!PC_String_Parse(handle, &tempStr)) {
1313
cgDC.Assets.menuBuzzSound = trap_S_RegisterSound( tempStr, qfalse );
1317
if (Q_stricmp(token.string, "cursor") == 0) {
1318
if (!PC_String_Parse(handle, &cgDC.Assets.cursorStr)) {
1321
cgDC.Assets.cursor = trap_R_RegisterShaderNoMip( cgDC.Assets.cursorStr);
1325
if (Q_stricmp(token.string, "fadeClamp") == 0) {
1326
if (!PC_Float_Parse(handle, &cgDC.Assets.fadeClamp)) {
1332
if (Q_stricmp(token.string, "fadeCycle") == 0) {
1333
if (!PC_Int_Parse(handle, &cgDC.Assets.fadeCycle)) {
1339
if (Q_stricmp(token.string, "fadeAmount") == 0) {
1340
if (!PC_Float_Parse(handle, &cgDC.Assets.fadeAmount)) {
1346
if (Q_stricmp(token.string, "shadowX") == 0) {
1347
if (!PC_Float_Parse(handle, &cgDC.Assets.shadowX)) {
1353
if (Q_stricmp(token.string, "shadowY") == 0) {
1354
if (!PC_Float_Parse(handle, &cgDC.Assets.shadowY)) {
1360
if (Q_stricmp(token.string, "shadowColor") == 0) {
1361
if (!PC_Color_Parse(handle, &cgDC.Assets.shadowColor)) {
1364
cgDC.Assets.shadowFadeClamp = cgDC.Assets.shadowColor[3];
1368
return qfalse; // bk001204 - why not?
1371
void CG_ParseMenu(const char *menuFile) {
1375
handle = trap_PC_LoadSource(menuFile);
1377
handle = trap_PC_LoadSource("ui/testhud.menu");
1382
if (!trap_PC_ReadToken( handle, &token )) {
1386
//if ( Q_stricmp( token, "{" ) ) {
1387
// Com_Printf( "Missing { in menu file\n" );
1391
//if ( menuCount == MAX_MENUS ) {
1392
// Com_Printf( "Too many menus!\n" );
1396
if ( token.string[0] == '}' ) {
1400
if (Q_stricmp(token.string, "assetGlobalDef") == 0) {
1401
if (CG_Asset_Parse(handle)) {
1409
if (Q_stricmp(token.string, "menudef") == 0) {
1414
trap_PC_FreeSource(handle);
1417
qboolean CG_Load_Menu(char **p) {
1420
token = COM_ParseExt(p, qtrue);
1422
if (token[0] != '{') {
1428
token = COM_ParseExt(p, qtrue);
1430
if (Q_stricmp(token, "}") == 0) {
1434
if ( !token || token[0] == 0 ) {
1438
CG_ParseMenu(token);
1445
void CG_LoadMenus(const char *menuFile) {
1450
static char buf[MAX_MENUDEFFILE];
1452
start = trap_Milliseconds();
1454
len = trap_FS_FOpenFile( menuFile, &f, FS_READ );
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 );
1459
trap_Error( va( S_COLOR_RED "default menu file not found: ui/hud.txt, unable to continue!\n") );
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 );
1469
trap_FS_Read( buf, len, f );
1471
trap_FS_FCloseFile( f );
1480
token = COM_ParseExt( &p, qtrue );
1481
if( !token || token[0] == 0 || token[0] == '}') {
1485
//if ( Q_stricmp( token, "{" ) ) {
1486
// Com_Printf( "Missing { in menu file\n" );
1490
//if ( menuCount == MAX_MENUS ) {
1491
// Com_Printf( "Too many menus!\n" );
1495
if ( Q_stricmp( token, "}" ) == 0 ) {
1499
if (Q_stricmp(token, "loadmenu") == 0) {
1500
if (CG_Load_Menu(&p)) {
1508
Com_Printf("UI menu load time = %d milli seconds\n", trap_Milliseconds() - start);
1514
static qboolean CG_OwnerDrawHandleKey(int ownerDraw, int flags, float *special, int key) {
1519
static int CG_FeederCount(float feederID) {
1522
if (feederID == FEEDER_REDTEAM_LIST) {
1523
for (i = 0; i < cg.numScores; i++) {
1524
if (cg.scores[i].team == TEAM_RED) {
1528
} else if (feederID == FEEDER_BLUETEAM_LIST) {
1529
for (i = 0; i < cg.numScores; i++) {
1530
if (cg.scores[i].team == TEAM_BLUE) {
1534
} else if (feederID == FEEDER_SCOREBOARD) {
1535
return cg.numScores;
1541
void CG_SetScoreSelection(void *p) {
1542
menuDef_t *menu = (menuDef_t*)p;
1543
playerState_t *ps = &cg.snap->ps;
1546
for (i = 0; i < cg.numScores; i++) {
1547
if (cg.scores[i].team == TEAM_RED) {
1549
} else if (cg.scores[i].team == TEAM_BLUE) {
1552
if (ps->clientNum == cg.scores[i].client) {
1553
cg.selectedScore = i;
1558
// just interested in setting the selected score
1562
if ( cgs.gametype >= GT_TEAM ) {
1563
int feeder = FEEDER_REDTEAM_LIST;
1565
if (cg.scores[cg.selectedScore].team == TEAM_BLUE) {
1566
feeder = FEEDER_BLUETEAM_LIST;
1569
Menu_SetFeederSelection(menu, feeder, i, NULL);
1571
Menu_SetFeederSelection(menu, FEEDER_SCOREBOARD, cg.selectedScore, NULL);
1575
// FIXME: might need to cache this info
1576
static clientInfo_t * CG_InfoFromScoreIndex(int index, int team, int *scoreIndex) {
1578
if ( cgs.gametype >= GT_TEAM ) {
1580
for (i = 0; i < cg.numScores; i++) {
1581
if (cg.scores[i].team == team) {
1582
if (count == index) {
1584
return &cgs.clientinfo[cg.scores[i].client];
1590
*scoreIndex = index;
1591
return &cgs.clientinfo[ cg.scores[index].client ];
1594
static const char *CG_FeederItemText(float feederID, int index, int column, qhandle_t *handle) {
1597
clientInfo_t *info = NULL;
1603
if (feederID == FEEDER_REDTEAM_LIST) {
1605
} else if (feederID == FEEDER_BLUETEAM_LIST) {
1609
info = CG_InfoFromScoreIndex(index, team, &scoreIndex);
1610
sp = &cg.scores[scoreIndex];
1612
if (info && info->infoValid) {
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;
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 );
1636
*handle = CG_StatusHandle(info->teamTask);
1640
if ( cg.snap->ps.stats[ STAT_CLIENTS_READY ] & ( 1 << sp->client ) ) {
1644
if (cgs.gametype == GT_TOURNAMENT) {
1645
return va("%i/%i", info->wins, info->losses);
1646
} else if (info->infoValid && info->team == TEAM_SPECTATOR ) {
1652
if (info->teamLeader) {
1661
return va("%i", info->score);
1664
return va("%4i", sp->time);
1667
if ( sp->ping == -1 ) {
1668
return "connecting";
1670
return va("%4i", sp->ping);
1678
static qhandle_t CG_FeederItemImage(float feederID, int index) {
1682
static void CG_FeederSelection(float feederID, int index) {
1683
if ( cgs.gametype >= GT_TEAM ) {
1685
int team = (feederID == FEEDER_REDTEAM_LIST) ? TEAM_RED : TEAM_BLUE;
1687
for (i = 0; i < cg.numScores; i++) {
1688
if (cg.scores[i].team == team) {
1689
if (index == count) {
1690
cg.selectedScore = i;
1696
cg.selectedScore = index;
1701
#ifdef MISSIONPACK // bk001204 - only needed there
1702
static float CG_Cvar_Get(const char *cvar) {
1704
memset(buff, 0, sizeof(buff));
1705
trap_Cvar_VariableStringBuffer(cvar, buff, sizeof(buff));
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);
1715
static int CG_OwnerDrawWidth(int ownerDraw, float scale) {
1716
switch (ownerDraw) {
1718
return CG_Text_Width(CG_GameTypeString(), scale, 0);
1719
case CG_GAME_STATUS:
1720
return CG_Text_Width(CG_GetGameStatusText(), scale, 0);
1723
return CG_Text_Width(CG_GetKillerText(), scale, 0);
1726
return CG_Text_Width(cg_redTeamName.string, scale, 0);
1729
return CG_Text_Width(cg_blueTeamName.string, scale, 0);
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);
1741
static void CG_StopCinematic(int handle) {
1742
trap_CIN_StopCinematic(handle);
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);
1750
static void CG_RunCinematicFrame(int handle) {
1751
trap_CIN_RunCinematic(handle);
1760
void CG_LoadHudMenu( void ) {
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;
1814
Init_Display(&cgDC);
1818
trap_Cvar_VariableStringBuffer("cg_hudFiles", buff, sizeof(buff));
1820
if (hudSet[0] == '\0') {
1821
hudSet = "ui/hud.txt";
1824
CG_LoadMenus(hudSet);
1827
void CG_AssetCache( void ) {
1828
//if (Assets.textFont == NULL) {
1829
// trap_R_RegisterFont("fonts/arial.ttf", 72, &Assets.textFont);
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 );
1856
Called after every level change or subsystem restart
1857
Will perform callbacks to make the loading info screen update.
1860
void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum ) {
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) );
1870
cg.clientNum = clientNum;
1872
cgs.processedSnapshotNum = serverMessageNum;
1873
cgs.serverCommandSequence = serverCommandSequence;
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" );
1884
CG_InitConsoleCommands();
1886
cg.weaponSelect = WP_MACHINEGUN;
1888
cgs.redflag = cgs.blueflag = -1; // For compatibily, default to unset for
1889
cgs.flagStatus = -1;
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;
1897
// get the gamestate from the client system
1898
trap_GetGameState( &cgs.gameState );
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 );
1906
s = CG_ConfigString( CS_LEVEL_START_TIME );
1907
cgs.levelStartTime = atoi( s );
1909
CG_ParseServerinfo();
1912
CG_LoadingString( "collision map" );
1914
trap_CM_LoadMap( cgs.mapname );
1920
cg.loading = qtrue; // force players to load instead of defer
1922
CG_LoadingString( "sounds" );
1924
CG_RegisterSounds();
1926
CG_LoadingString( "graphics" );
1928
CG_RegisterGraphics();
1930
CG_LoadingString( "clients" );
1932
CG_RegisterClients(); // if low on memory, some clients will be deferred
1936
CG_LoadHudMenu(); // load new hud stuff
1939
cg.loading = qfalse; // future players will be deferred
1941
CG_InitLocalEntities();
1945
// remove the last loading update
1946
cg.infoScreenText[0] = 0;
1948
// Make sure we have update values (scores)
1949
CG_SetConfigValues();
1953
CG_LoadingString( "" );
1959
CG_ShaderStateChanged();
1961
trap_S_ClearLoopingSounds( qtrue );
1968
Called before every level change or subsystem restart
1971
void CG_Shutdown( void ) {
1972
// some mods may need to do cleanup work here,
1973
// like closing files or archiving session data
1981
type 0 - no event handling
1987
void CG_EventHandling(int type) {
1992
void CG_KeyEvent(int key, qboolean down) {
1995
void CG_MouseEvent(int x, int y) {