1 /*
2 Copyright (C) 1997-2001 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 //
21 // cg_main.c
22 //
23
24 #include "cg_local.h"
25
26 cgState_t cg;
27 cgMedia_t cgMedia;
28 uiMedia_t uiMedia;
29
30 cVar_t *cg_advInfrared;
31 cVar_t *cg_brassTime;
32 cVar_t *cg_decals;
33 cVar_t *cg_decalBurnLife;
34 cVar_t *cg_decalFadeTime;
35 cVar_t *cg_decalLife;
36 cVar_t *cg_decalLOD;
37 cVar_t *cg_decalMax;
38 cVar_t *cg_mapEffects;
39 cVar_t *cl_add_particles;
40 cVar_t *cg_particleCulling;
41 cVar_t *cg_particleGore;
42 cVar_t *cg_particleMax;
43 cVar_t *cg_particleShading;
44 cVar_t *cg_particleSmokeLinger;
45 cVar_t *cg_railCoreRed;
46 cVar_t *cg_railCoreGreen;
47 cVar_t *cg_railCoreBlue;
48 cVar_t *cg_railSpiral;
49 cVar_t *cg_railSpiralRed;
50 cVar_t *cg_railSpiralGreen;
51 cVar_t *cg_railSpiralBlue;
52 cVar_t *cg_thirdPerson;
53 cVar_t *cg_thirdPersonAngle;
54 cVar_t *cg_thirdPersonClip;
55 cVar_t *cg_thirdPersonDist;
56
57 cVar_t *cl_explorattle;
58 cVar_t *cl_explorattle_scale;
59 cVar_t *cl_footsteps;
60 cVar_t *cl_gun;
61 cVar_t *cl_noskins;
62 cVar_t *cl_predict;
63 cVar_t *cl_showmiss;
64 cVar_t *cl_vwep;
65
66 cVar_t *gender_auto;
67 cVar_t *gender;
68 cVar_t *hand;
69 cVar_t *skin;
70
71 cVar_t *glm_advgas;
72 cVar_t *glm_advstingfire;
73 cVar_t *glm_blobtype;
74 cVar_t *glm_bluestingfire;
75 cVar_t *glm_flashpred;
76 cVar_t *glm_flwhite;
77 cVar_t *glm_forcecache;
78 cVar_t *glm_jumppred;
79 cVar_t *glm_showclass;
80
81 cVar_t *cl_testblend;
82 cVar_t *cl_testentities;
83 cVar_t *cl_testlights;
84 cVar_t *cl_testparticles;
85
86 cVar_t *r_hudScale;
87 cVar_t *r_fontScale;
88
89 cVar_t *crosshair;
90 cVar_t *ch_alpha;
91 cVar_t *ch_pulse;
92 cVar_t *ch_scale;
93 cVar_t *ch_red;
94 cVar_t *ch_green;
95 cVar_t *ch_blue;
96 cVar_t *ch_xOffset;
97 cVar_t *ch_yOffset;
98
99 cVar_t *cl_showfps;
100 cVar_t *cl_showping;
101 cVar_t *cl_showtime;
102
103 cVar_t *con_chatHud;
104 cVar_t *con_chatHudLines;
105 cVar_t *con_chatHudPosX;
106 cVar_t *con_chatHudPosY;
107 cVar_t *con_chatHudShadow;
108 cVar_t *con_notifyfade;
109 cVar_t *con_notifylarge;
110 cVar_t *con_notifylines;
111 cVar_t *con_notifytime;
112 cVar_t *con_alpha;
113 cVar_t *con_clock;
114 cVar_t *con_drop;
115 cVar_t *con_scroll;
116
117 cVar_t *scr_conspeed;
118 cVar_t *scr_centertime;
119 cVar_t *scr_showpause;
120 cVar_t *scr_hudalpha;
121
122 cVar_t *scr_netgraph;
123 cVar_t *scr_timegraph;
124 cVar_t *scr_debuggraph;
125 cVar_t *scr_graphheight;
126 cVar_t *scr_graphscale;
127 cVar_t *scr_graphshift;
128 cVar_t *scr_graphalpha;
129
130 cVar_t *viewsize;
131 cVar_t *gl_polyblend;
132
133 // ====================================================================
134
135 /*
136 ==================
137 CG_SetRefConfig
138 ==================
139 */
CG_SetRefConfig(refConfig_t * inConfig)140 void CG_SetRefConfig (refConfig_t *inConfig)
141 {
142 cg.refConfig = *inConfig;
143
144 // Force a cg.hudScale update
145 r_hudScale->modified = qTrue;
146 }
147
148
149 /*
150 =================
151 CG_UpdateCvars
152 =================
153 */
CG_UpdateCvars(void)154 void CG_UpdateCvars (void)
155 {
156 // HUD scale
157 if (r_hudScale->modified) {
158 r_hudScale->modified = qFalse;
159 if (r_hudScale->floatVal <= 0)
160 cgi.Cvar_VariableSetValue (r_hudScale, 1, qTrue);
161
162 cg.hudScale[0] = r_hudScale->floatVal;
163 cg.hudScale[1] = r_hudScale->floatVal;
164 }
165
166 // cg_brassTime
167 if (cg_brassTime->modified) {
168 cg_brassTime->modified = qFalse;
169 if (cg_brassTime->floatVal < 0)
170 cgi.Cvar_VariableSetValue (cg_brassTime, 0, qTrue);
171 }
172
173 // cg_decalBurnLife
174 if (cg_decalBurnLife->modified) {
175 cg_decalBurnLife->modified = qFalse;
176 if (cg_decalBurnLife->floatVal < 0)
177 cgi.Cvar_VariableSetValue (cg_decalBurnLife, 0, qTrue);
178 }
179
180 // cg_decalFadeTime
181 if (cg_decalFadeTime->modified) {
182 cg_decalFadeTime->modified = qFalse;
183 if (cg_decalFadeTime->floatVal < 0)
184 cgi.Cvar_VariableSetValue (cg_decalFadeTime, 0, qTrue);
185 }
186
187 // cg_decalLife
188 if (cg_decalLife->modified) {
189 cg_decalLife->modified = qFalse;
190 if (cg_decalLife->floatVal < 0)
191 cgi.Cvar_VariableSetValue (cg_decalLife, 0, qTrue);
192 }
193
194 // cg_decalMax
195 if (cg_decalMax->modified) {
196 cg_decalMax->modified = qFalse;
197 if (cg_decalMax->intVal > MAX_REF_DECALS)
198 cgi.Cvar_VariableSetValue (cg_decalMax, MAX_REF_DECALS, qTrue);
199 else if (cg_decalMax->intVal < 0)
200 cgi.Cvar_VariableSetValue (cg_decalMax, 0, qTrue);
201 }
202
203 // cg_particleMax
204 if (cg_particleMax->modified) {
205 cg_particleMax->modified = qFalse;
206 if (cg_particleMax->intVal > MAX_PARTICLES)
207 cgi.Cvar_VariableSetValue (cg_particleMax, MAX_PARTICLES, qTrue);
208 else if (cg_particleMax->intVal < 0)
209 cgi.Cvar_VariableSetValue (cg_particleMax, 0, qTrue);
210 }
211 }
212
213 /*
214 =======================================================================
215
216 CONSOLE FUNCTIONS
217
218 =======================================================================
219 */
220
221 /*
222 =================
223 CG_Skins_f
224
225 Load or download any custom player skins and models
226 =================
227 */
CG_Skins_f(void)228 static void CG_Skins_f (void)
229 {
230 int i;
231
232 if (cg.currGameMod == GAME_MOD_GLOOM) {
233 Com_Printf (PRNT_WARNING, "Command cannot be used in Gloom (considered cheating).\n");
234 return;
235 }
236
237 for (i=0 ; i<MAX_CS_CLIENTS ; i++) {
238 if (!cg.configStrings[CS_PLAYERSKINS+i][0])
239 continue;
240
241 Com_Printf (0, "client %i: %s\n", i, cg.configStrings[CS_PLAYERSKINS+i]);
242 cgi.R_UpdateScreen ();
243 cgi.Sys_SendKeyEvents (); // pump message loop
244 CG_ParseClientinfo (i);
245 }
246 }
247
248
249 /*
250 =================
251 CG_ThirdPerson_f
252 =================
253 */
CG_ThirdPerson_f(void)254 static void CG_ThirdPerson_f (void)
255 {
256 cgi.Cvar_SetValue ("cg_thirdPerson", !cg_thirdPerson->intVal, qFalse);
257 }
258
259 /*
260 =======================================================================
261
262 INIT / SHUTDOWN
263
264 =======================================================================
265 */
266
267 static void *cmd_glmCache;
268 static void *cmd_skins;
269 static void *cmd_thirdPerson;
270 static void *cmd_say;
271 static void *cmd_say_team;
272 static void *cmd_wave;
273 static void *cmd_inven;
274 static void *cmd_kill;
275 static void *cmd_use;
276 static void *cmd_drop;
277 static void *cmd_info;
278 static void *cmd_prog;
279 static void *cmd_give;
280 static void *cmd_god;
281 static void *cmd_notarget;
282 static void *cmd_noclip;
283 static void *cmd_invuse;
284 static void *cmd_invprev;
285 static void *cmd_invnext;
286 static void *cmd_invdrop;
287 static void *cmd_weapnext;
288 static void *cmd_weapprev;
289
290 /*
291 =================
292 CG_CopyConfigStrings
293
294 This is necessary to make certain configstrings are consistant between
295 CGame and the client. Sometimes while connecting a configstring is sent
296 just before the CGame module is loaded.
297 =================
298 */
CG_CopyConfigStrings(void)299 void CG_CopyConfigStrings (void)
300 {
301 int num;
302
303 for (num=0 ; num<MAX_CFGSTRINGS ; num++) {
304 cgi.GetConfigString (num, cg.configStrings[num], MAX_CFGSTRLEN);
305
306 CG_ParseConfigString (num, cg.configStrings[num]);
307 }
308 }
309
310
311 /*
312 ==================
313 CG_RegisterMain
314 ==================
315 */
CG_RegisterMain(void)316 static void CG_RegisterMain (void)
317 {
318 cg_advInfrared = cgi.Cvar_Register ("cg_advInfrared", "1", CVAR_ARCHIVE);
319 cg_brassTime = cgi.Cvar_Register ("cg_brassTime", "10", CVAR_ARCHIVE);
320 cg_decals = cgi.Cvar_Register ("cg_decals", "1", CVAR_ARCHIVE);
321 cg_decalBurnLife = cgi.Cvar_Register ("cg_decalBurnLife", "10", CVAR_ARCHIVE);
322 cg_decalFadeTime = cgi.Cvar_Register ("cg_decalFadeTime", "1", CVAR_ARCHIVE);
323 cg_decalLife = cgi.Cvar_Register ("cg_decalLife", "60", CVAR_ARCHIVE);
324 cg_decalLOD = cgi.Cvar_Register ("cg_decalLOD", "1", CVAR_ARCHIVE);
325 cg_decalMax = cgi.Cvar_Register ("cg_decalMax", "4096", CVAR_ARCHIVE);
326 cg_mapEffects = cgi.Cvar_Register ("cg_mapEffects", "1", CVAR_ARCHIVE);
327 cl_add_particles = cgi.Cvar_Register ("cl_particles", "1", 0);
328 cg_particleCulling = cgi.Cvar_Register ("cg_particleCulling", "1", CVAR_ARCHIVE);
329 cg_particleGore = cgi.Cvar_Register ("cg_particleGore", "3", CVAR_ARCHIVE);
330 cg_particleMax = cgi.Cvar_Register ("cg_particleMax", "8192", CVAR_ARCHIVE);
331 cg_particleShading = cgi.Cvar_Register ("cg_particleShading", "1", CVAR_ARCHIVE);
332 cg_particleSmokeLinger = cgi.Cvar_Register ("cg_particleSmokeLinger", "3", CVAR_ARCHIVE);
333 cg_railCoreRed = cgi.Cvar_Register ("cg_railCoreRed", "0.75", CVAR_ARCHIVE);
334 cg_railCoreGreen = cgi.Cvar_Register ("cg_railCoreGreen", "1", CVAR_ARCHIVE);
335 cg_railCoreBlue = cgi.Cvar_Register ("cg_railCoreBlue", "1", CVAR_ARCHIVE);
336 cg_railSpiral = cgi.Cvar_Register ("cg_railSpiral", "1", CVAR_ARCHIVE);
337 cg_railSpiralRed = cgi.Cvar_Register ("cg_railSpiralRed", "0", CVAR_ARCHIVE);
338 cg_railSpiralGreen = cgi.Cvar_Register ("cg_railSpiralGreen", "0.5", CVAR_ARCHIVE);
339 cg_railSpiralBlue = cgi.Cvar_Register ("cg_railSpiralBlue", "0.9", CVAR_ARCHIVE);
340
341 if (cg.currGameMod == GAME_MOD_GLOOM)
342 cg_thirdPerson = cgi.Cvar_Register ("cg_thirdPerson", "0", CVAR_ARCHIVE|CVAR_CHEAT);
343 else
344 cg_thirdPerson = cgi.Cvar_Register ("cg_thirdPerson", "0", CVAR_ARCHIVE);
345 cg_thirdPersonAngle = cgi.Cvar_Register ("cg_thirdPersonAngle", "30", CVAR_ARCHIVE);
346 cg_thirdPersonClip = cgi.Cvar_Register ("cg_thirdPersonClip", "1", CVAR_ARCHIVE);
347 cg_thirdPersonDist = cgi.Cvar_Register ("cg_thirdPersonDist", "50", CVAR_ARCHIVE);
348
349 cl_explorattle = cgi.Cvar_Register ("cl_explorattle", "1", CVAR_ARCHIVE);
350 cl_explorattle_scale = cgi.Cvar_Register ("cl_explorattle_scale", "0.3", CVAR_ARCHIVE);
351 cl_footsteps = cgi.Cvar_Register ("cl_footsteps", "1", 0);
352 cl_gun = cgi.Cvar_Register ("cl_gun", "1", 0);
353 cl_noskins = cgi.Cvar_Register ("cl_noskins", "0", CVAR_CHEAT);
354 cl_predict = cgi.Cvar_Register ("cl_predict", "1", 0);
355 cl_showmiss = cgi.Cvar_Register ("cl_showmiss", "0", 0);
356 cl_vwep = cgi.Cvar_Register ("cl_vwep", "1", CVAR_ARCHIVE);
357
358 gender_auto = cgi.Cvar_Register ("gender_auto", "1", CVAR_ARCHIVE);
359 gender = cgi.Cvar_Register ("gender", "male", CVAR_USERINFO|CVAR_ARCHIVE);
360 hand = cgi.Cvar_Register ("hand", "0", CVAR_USERINFO|CVAR_ARCHIVE);
361 skin = cgi.Cvar_Register ("skin", "male/grunt", CVAR_USERINFO|CVAR_ARCHIVE);
362
363 glm_advgas = cgi.Cvar_Register ("glm_advgas", "0", CVAR_ARCHIVE);
364 glm_advstingfire = cgi.Cvar_Register ("glm_advstingfire", "1", CVAR_ARCHIVE);
365 glm_blobtype = cgi.Cvar_Register ("glm_blobtype", "1", CVAR_ARCHIVE);
366 glm_bluestingfire = cgi.Cvar_Register ("glm_bluestingfire", "0", CVAR_ARCHIVE);
367 glm_flashpred = cgi.Cvar_Register ("glm_flashpred", "0", CVAR_ARCHIVE);
368 glm_flwhite = cgi.Cvar_Register ("glm_flwhite", "1", CVAR_ARCHIVE);
369 glm_forcecache = cgi.Cvar_Register ("glm_forcecache", "0", CVAR_ARCHIVE);
370 glm_jumppred = cgi.Cvar_Register ("glm_jumppred", "0", CVAR_ARCHIVE);
371 glm_showclass = cgi.Cvar_Register ("glm_showclass", "1", CVAR_ARCHIVE);
372
373 cl_testblend = cgi.Cvar_Register ("cl_testblend", "0", CVAR_CHEAT);
374 cl_testentities = cgi.Cvar_Register ("cl_testentities", "0", CVAR_CHEAT);
375 cl_testlights = cgi.Cvar_Register ("cl_testlights", "0", CVAR_CHEAT);
376 cl_testparticles = cgi.Cvar_Register ("cl_testparticles", "0", CVAR_CHEAT);
377
378 r_hudScale = cgi.Cvar_Register ("r_hudScale", "1", CVAR_ARCHIVE);
379 r_fontScale = cgi.Cvar_Register ("r_fontScale", "1", CVAR_ARCHIVE);
380
381 if (cg.currGameMod == GAME_MOD_DDAY)
382 crosshair = cgi.Cvar_Register ("crosshair", "0", CVAR_ARCHIVE|CVAR_CHEAT);
383 else
384 crosshair = cgi.Cvar_Register ("crosshair", "0", CVAR_ARCHIVE);
385 ch_alpha = cgi.Cvar_Register ("ch_alpha", "1", CVAR_ARCHIVE);
386 ch_pulse = cgi.Cvar_Register ("ch_pulse", "1", CVAR_ARCHIVE);
387 ch_scale = cgi.Cvar_Register ("ch_scale", "1", CVAR_ARCHIVE);
388 ch_red = cgi.Cvar_Register ("ch_red", "1", CVAR_ARCHIVE);
389 ch_green = cgi.Cvar_Register ("ch_green", "1", CVAR_ARCHIVE);
390 ch_blue = cgi.Cvar_Register ("ch_blue", "1", CVAR_ARCHIVE);
391 ch_xOffset = cgi.Cvar_Register ("ch_xOffset", "0", CVAR_ARCHIVE);
392 ch_yOffset = cgi.Cvar_Register ("ch_yOffset", "0", CVAR_ARCHIVE);
393
394 cl_showfps = cgi.Cvar_Register ("cl_showfps", "1", CVAR_ARCHIVE);
395 cl_showping = cgi.Cvar_Register ("cl_showping", "1", CVAR_ARCHIVE);
396 cl_showtime = cgi.Cvar_Register ("cl_showtime", "1", CVAR_ARCHIVE);
397
398 con_chatHud = cgi.Cvar_Register ("con_chatHud", "0", CVAR_ARCHIVE);
399 con_chatHudLines = cgi.Cvar_Register ("con_chatHudLines", "4", CVAR_ARCHIVE);
400 con_chatHudPosX = cgi.Cvar_Register ("con_chatHudPosX", "8", CVAR_ARCHIVE);
401 con_chatHudPosY = cgi.Cvar_Register ("con_chatHudPosY", "-14", CVAR_ARCHIVE);
402 con_chatHudShadow = cgi.Cvar_Register ("con_chatHudShadow", "0", CVAR_ARCHIVE);
403 con_notifyfade = cgi.Cvar_Register ("con_notifyfade", "1", CVAR_ARCHIVE);
404 con_notifylarge = cgi.Cvar_Register ("con_notifylarge", "0", CVAR_ARCHIVE);
405 con_notifylines = cgi.Cvar_Register ("con_notifylines", "4", CVAR_ARCHIVE);
406 con_notifytime = cgi.Cvar_Register ("con_notifytime", "3", CVAR_ARCHIVE);
407 con_alpha = cgi.Cvar_Register ("con_alpha", "1", CVAR_ARCHIVE);
408 con_clock = cgi.Cvar_Register ("con_clock", "1", CVAR_ARCHIVE);
409 con_drop = cgi.Cvar_Register ("con_drop", "0.5", CVAR_ARCHIVE);
410 con_scroll = cgi.Cvar_Register ("con_scroll", "2", CVAR_ARCHIVE);
411
412 scr_conspeed = cgi.Cvar_Register ("scr_conspeed", "3", 0);
413 scr_centertime = cgi.Cvar_Register ("scr_centertime", "2.5", 0);
414 scr_showpause = cgi.Cvar_Register ("scr_showpause", "1", 0);
415 scr_hudalpha = cgi.Cvar_Register ("scr_hudalpha", "1", CVAR_ARCHIVE);
416
417 scr_netgraph = cgi.Cvar_Register ("netgraph", "0", 0);
418 scr_timegraph = cgi.Cvar_Register ("timegraph", "0", 0);
419 scr_debuggraph = cgi.Cvar_Register ("debuggraph", "0", 0);
420 scr_graphheight = cgi.Cvar_Register ("graphheight", "32", 0);
421 scr_graphscale = cgi.Cvar_Register ("graphscale", "1", 0);
422 scr_graphshift = cgi.Cvar_Register ("graphshift", "0", 0);
423 scr_graphalpha = cgi.Cvar_Register ("scr_graphalpha", "0.6", CVAR_ARCHIVE);
424
425 viewsize = cgi.Cvar_Register ("viewsize", "100", CVAR_ARCHIVE);
426
427 if (cg.currGameMod == GAME_MOD_GLOOM)
428 gl_polyblend = cgi.Cvar_Register ("gl_polyblend", "1", CVAR_CHEAT);
429 else
430 gl_polyblend = cgi.Cvar_Register ("gl_polyblend", "1", 0);
431
432 gender->modified = qFalse; // clear this so we know when user sets it manually
433
434 cmd_glmCache = cgi.Cmd_AddCommand ("glmcache", CG_CacheGloomMedia, "Forces caching of Gloom media right now");
435 cmd_skins = cgi.Cmd_AddCommand ("skins", CG_Skins_f, "Lists skins of players connected");
436 cmd_thirdPerson = cgi.Cmd_AddCommand ("thirdPerson", CG_ThirdPerson_f, "Toggles the third person camera");
437
438 // Userinfo cvars
439 cgi.Cvar_Register ("fov", "90", CVAR_USERINFO|CVAR_ARCHIVE);
440 cgi.Cvar_Register ("password", "", CVAR_USERINFO);
441 cgi.Cvar_Register ("spectator", "0", CVAR_USERINFO);
442 cgi.Cvar_Register ("msg", "0", CVAR_USERINFO|CVAR_ARCHIVE);
443 cgi.Cvar_Register ("name", "unnamed", CVAR_USERINFO|CVAR_ARCHIVE);
444 cgi.Cvar_Register ("rate", "8000", CVAR_USERINFO|CVAR_ARCHIVE);
445 cgi.Cvar_Register ("gender", "male", CVAR_USERINFO|CVAR_ARCHIVE);
446 cgi.Cvar_Register ("hand", "0", CVAR_USERINFO|CVAR_ARCHIVE);
447 cgi.Cvar_Register ("skin", "", CVAR_USERINFO|CVAR_ARCHIVE);
448
449 // Register our commands
450 cmd_say = cgi.Cmd_AddCommand ("say", CG_Say_Preprocessor, "");
451 cmd_say_team = cgi.Cmd_AddCommand ("say_team", CG_Say_Preprocessor, "");
452
453 /*
454 ** Forward to server commands...
455 ** The only thing this does is allow command completion to work -- all unknown
456 ** commands are automatically forwarded to the server
457 */
458 cmd_wave = cgi.Cmd_AddCommand ("wave", NULL, "");
459 cmd_inven = cgi.Cmd_AddCommand ("inven", NULL, "");
460 cmd_kill = cgi.Cmd_AddCommand ("kill", NULL, "");
461 cmd_use = cgi.Cmd_AddCommand ("use", NULL, "");
462 cmd_drop = cgi.Cmd_AddCommand ("drop", NULL, "");
463 cmd_info = cgi.Cmd_AddCommand ("info", NULL, "");
464 cmd_prog = cgi.Cmd_AddCommand ("prog", NULL, "");
465 cmd_give = cgi.Cmd_AddCommand ("give", NULL, "");
466 cmd_god = cgi.Cmd_AddCommand ("god", NULL, "");
467 cmd_notarget = cgi.Cmd_AddCommand ("notarget", NULL, "");
468 cmd_noclip = cgi.Cmd_AddCommand ("noclip", NULL, "");
469 cmd_invuse = cgi.Cmd_AddCommand ("invuse", NULL, "");
470 cmd_invprev = cgi.Cmd_AddCommand ("invprev", NULL, "");
471 cmd_invnext = cgi.Cmd_AddCommand ("invnext", NULL, "");
472 cmd_invdrop = cgi.Cmd_AddCommand ("invdrop", NULL, "");
473 cmd_weapnext = cgi.Cmd_AddCommand ("weapnext", NULL, "");
474 cmd_weapprev = cgi.Cmd_AddCommand ("weapprev", NULL, "");
475 }
476
477
478 /*
479 ==================
480 CG_RemoveCmds
481 ==================
482 */
CG_RemoveCmds(void)483 static void CG_RemoveCmds (void)
484 {
485 cgi.Cmd_RemoveCommand ("glmcache", cmd_glmCache);
486 cgi.Cmd_RemoveCommand ("skins", cmd_skins);
487 cgi.Cmd_RemoveCommand ("thirdPerson", cmd_thirdPerson);
488
489 cgi.Cmd_RemoveCommand ("say", cmd_say);
490 cgi.Cmd_RemoveCommand ("say_team", cmd_say_team);
491 cgi.Cmd_RemoveCommand ("wave", cmd_wave);
492 cgi.Cmd_RemoveCommand ("inven", cmd_inven);
493 cgi.Cmd_RemoveCommand ("kill", cmd_kill);
494 cgi.Cmd_RemoveCommand ("use", cmd_use);
495 cgi.Cmd_RemoveCommand ("drop", cmd_drop);
496 cgi.Cmd_RemoveCommand ("info", cmd_info);
497 cgi.Cmd_RemoveCommand ("prog", cmd_prog);
498 cgi.Cmd_RemoveCommand ("give", cmd_give);
499 cgi.Cmd_RemoveCommand ("god", cmd_god);
500 cgi.Cmd_RemoveCommand ("notarget", cmd_notarget);
501 cgi.Cmd_RemoveCommand ("noclip", cmd_noclip);
502 cgi.Cmd_RemoveCommand ("invuse", cmd_invuse);
503 cgi.Cmd_RemoveCommand ("invprev", cmd_invprev);
504 cgi.Cmd_RemoveCommand ("invnext", cmd_invnext);
505 cgi.Cmd_RemoveCommand ("invdrop", cmd_invdrop);
506 cgi.Cmd_RemoveCommand ("weapnext", cmd_weapnext);
507 cgi.Cmd_RemoveCommand ("weapprev", cmd_weapprev);
508 }
509
510
511 /*
512 ==================
513 CG_LoadMap
514 ==================
515 */
CG_LoadMap(int playerNum,int serverProtocol,qBool attractLoop,qBool strafeHack,refConfig_t * inConfig)516 void CG_LoadMap (int playerNum, int serverProtocol, qBool attractLoop, qBool strafeHack, refConfig_t *inConfig)
517 {
518 // Default values
519 cg.frameCount = 1;
520 cg.gloomCheckClass = qFalse;
521 cg.gloomClassType = GLM_OBSERVER;
522 cg.playerNum = playerNum;
523 cg.serverProtocol = serverProtocol;
524 cg.attractLoop = attractLoop; // true if demo playback
525 cg.strafeHack = strafeHack; // god damnit
526
527 // Video settings
528 cg.refConfig = *inConfig;
529
530 // Copy config strings
531 CG_CopyConfigStrings ();
532
533 // Init media
534 CG_InitBaseMedia ();
535
536 cg.mapLoading = qTrue;
537 cg.mapLoaded = qFalse;
538
539 CG_MapInit ();
540
541 cg.mapLoading = qFalse;
542 cg.mapLoaded = qTrue;
543 }
544
545
546 /*
547 ==================
548 CG_Init
549 ==================
550 */
CG_Init(void)551 void CG_Init (void)
552 {
553 char *gameDir;
554
555 // Clear everything
556 memset (&cg, 0, sizeof (cgState_t));
557 memset (&cgMedia, 0, sizeof (cgMedia_t));
558 memset (&uiMedia, 0, sizeof (uiMedia));
559
560 CG_ClearEntities ();
561
562 // This nastiness is done because I don't
563 // feel like compiling several cgame libraries...
564 gameDir = cgi.FS_Gamedir ();
565 if (strstr (gameDir, "dday"))
566 cg.currGameMod = GAME_MOD_DDAY;
567 else if (strstr (gameDir, "giex"))
568 cg.currGameMod = GAME_MOD_GIEX;
569 else if (strstr (gameDir, "gloom"))
570 cg.currGameMod = GAME_MOD_GLOOM;
571 else if (strstr (gameDir, "lox"))
572 cg.currGameMod = GAME_MOD_LOX;
573 else if (strstr (gameDir, "rogue"))
574 cg.currGameMod = GAME_MOD_ROGUE;
575 else if (strstr (gameDir, "xatrix"))
576 cg.currGameMod = GAME_MOD_XATRIX;
577 else
578 cg.currGameMod = GAME_MOD_DEFAULT;
579
580 // Update refConfig
581 cgi.R_GetRefConfig (&cg.refConfig);
582
583 // Copy config strings
584 CG_CopyConfigStrings ();
585
586 // Initialize early needed media
587 CG_InitBaseMedia ();
588
589 // Register cvars and commands
590 V_Register ();
591 CG_WeapRegister ();
592 CG_RegisterMain ();
593
594 // Force cg.hudScale update
595 r_hudScale->modified = qTrue;
596
597 // Check cvar sanity
598 CG_UpdateCvars ();
599
600 // Location system init
601 CG_LocationInit ();
602
603 // Map FX init
604 CG_MapFXInit ();
605
606 // Load the UI
607 UI_Init ();
608 }
609
610
611 /*
612 ==================
613 CG_Shutdown
614 ==================
615 */
CG_Shutdown(void)616 void CG_Shutdown (void)
617 {
618 // Shutdown map fx
619 CG_MapFXShutdown ();
620
621 // Clean out entities
622 CG_ClearEntities ();
623
624 // Remove commands
625 CG_RemoveCmds ();
626 V_Unregister ();
627 CG_WeapUnregister ();
628
629 // Shutdown media
630 CG_ShutdownMap ();
631
632 // Shutdown the UI
633 UI_Shutdown ();
634
635 // Shutdown locations
636 CG_LocationShutdown ();
637
638 // The above function calls should release all of this anyways, but this is to be certain
639 CG_FreeTag (CGTAG_ANY);
640 CG_FreeTag (CGTAG_MAPFX);
641 CG_FreeTag (CGTAG_MENU);
642 }
643
644 //======================================================================
645
646 #ifndef CGAME_HARD_LINKED
647 /*
648 ==================
649 Com_Printf
650 ==================
651 */
Com_Printf(comPrint_t flags,char * fmt,...)652 void Com_Printf (comPrint_t flags, char *fmt, ...)
653 {
654 va_list argptr;
655 char text[MAX_COMPRINT];
656
657 // Evaluate args
658 va_start (argptr, fmt);
659 vsnprintf (text, sizeof (text), fmt, argptr);
660 va_end (argptr);
661
662 // Print
663 cgi.Com_Printf (flags, text);
664 }
665
666
667 /*
668 ==================
669 Com_DevPrintf
670 ==================
671 */
Com_DevPrintf(comPrint_t flags,char * fmt,...)672 void Com_DevPrintf (comPrint_t flags, char *fmt, ...)
673 {
674 va_list argptr;
675 char text[MAX_COMPRINT];
676
677 // Evaluate args
678 va_start (argptr, fmt);
679 vsnprintf (text, sizeof (text), fmt, argptr);
680 va_end (argptr);
681
682 // Print
683 cgi.Com_DevPrintf (flags, text);
684 }
685
686
687 /*
688 ==================
689 Com_Error
690 ==================
691 */
Com_Error(comError_t code,char * fmt,...)692 void Com_Error (comError_t code, char *fmt, ...)
693 {
694 va_list argptr;
695 char text[MAX_COMPRINT];
696
697 // Evaluate args
698 va_start (argptr, fmt);
699 vsnprintf (text, sizeof (text), fmt, argptr);
700 va_end (argptr);
701
702 // Print
703 cgi.Com_Error (code, text);
704 }
705 #endif // CGAME_HARD_LINKED
706