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