1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 
23 /*****************************************************************************
24  * name:		be_ea.c
25  *
26  * desc:		elementary actions
27  *
28  * $Archive: /MissionPack/code/botlib/be_ea.c $
29  *
30  *****************************************************************************/
31 
32 #include "../qcommon/q_shared.h"
33 #include "l_memory.h"
34 #include "l_script.h"
35 #include "l_precomp.h"
36 #include "l_struct.h"
37 #include "botlib.h"
38 #include "be_interface.h"
39 
40 #define MAX_USERMOVE				400
41 #define MAX_COMMANDARGUMENTS		10
42 #define ACTION_JUMPEDLASTFRAME		128
43 
44 bot_input_t *botinputs;
45 
46 //===========================================================================
47 //
48 // Parameter:				-
49 // Returns:					-
50 // Changes Globals:		-
51 //===========================================================================
EA_Say(int client,char * str)52 void EA_Say(int client, char *str)
53 {
54 	botimport.BotClientCommand(client, va("say %s", str) );
55 } //end of the function EA_Say
56 //===========================================================================
57 //
58 // Parameter:				-
59 // Returns:					-
60 // Changes Globals:		-
61 //===========================================================================
EA_SayTeam(int client,char * str)62 void EA_SayTeam(int client, char *str)
63 {
64 	botimport.BotClientCommand(client, va("say_team %s", str));
65 } //end of the function EA_SayTeam
66 //===========================================================================
67 //
68 // Parameter:				-
69 // Returns:					-
70 // Changes Globals:		-
71 //===========================================================================
EA_Tell(int client,int clientto,char * str)72 void EA_Tell(int client, int clientto, char *str)
73 {
74 	botimport.BotClientCommand(client, va("tell %d, %s", clientto, str));
75 } //end of the function EA_SayTeam
76 //===========================================================================
77 //
78 // Parameter:				-
79 // Returns:					-
80 // Changes Globals:		-
81 //===========================================================================
EA_UseItem(int client,char * it)82 void EA_UseItem(int client, char *it)
83 {
84 	botimport.BotClientCommand(client, va("use %s", it));
85 } //end of the function EA_UseItem
86 //===========================================================================
87 //
88 // Parameter:				-
89 // Returns:					-
90 // Changes Globals:		-
91 //===========================================================================
EA_DropItem(int client,char * it)92 void EA_DropItem(int client, char *it)
93 {
94 	botimport.BotClientCommand(client, va("drop %s", it));
95 } //end of the function EA_DropItem
96 //===========================================================================
97 //
98 // Parameter:				-
99 // Returns:					-
100 // Changes Globals:		-
101 //===========================================================================
EA_UseInv(int client,char * inv)102 void EA_UseInv(int client, char *inv)
103 {
104 	botimport.BotClientCommand(client, va("invuse %s", inv));
105 } //end of the function EA_UseInv
106 //===========================================================================
107 //
108 // Parameter:			-
109 // Returns:				-
110 // Changes Globals:		-
111 //===========================================================================
EA_DropInv(int client,char * inv)112 void EA_DropInv(int client, char *inv)
113 {
114 	botimport.BotClientCommand(client, va("invdrop %s", inv));
115 } //end of the function EA_DropInv
116 //===========================================================================
117 //
118 // Parameter:			-
119 // Returns:				-
120 // Changes Globals:		-
121 //===========================================================================
EA_Gesture(int client)122 void EA_Gesture(int client)
123 {
124 	bot_input_t *bi;
125 
126 	bi = &botinputs[client];
127 
128 	bi->actionflags |= ACTION_GESTURE;
129 } //end of the function EA_Gesture
130 //===========================================================================
131 //
132 // Parameter:				-
133 // Returns:					-
134 // Changes Globals:		-
135 //===========================================================================
EA_Command(int client,char * command)136 void EA_Command(int client, char *command)
137 {
138 	botimport.BotClientCommand(client, command);
139 } //end of the function EA_Command
140 //===========================================================================
141 //
142 // Parameter:			-
143 // Returns:				-
144 // Changes Globals:		-
145 //===========================================================================
EA_SelectWeapon(int client,int weapon)146 void EA_SelectWeapon(int client, int weapon)
147 {
148 	bot_input_t *bi;
149 
150 	bi = &botinputs[client];
151 
152 	bi->weapon = weapon;
153 } //end of the function EA_SelectWeapon
154 //===========================================================================
155 //
156 // Parameter:			-
157 // Returns:				-
158 // Changes Globals:		-
159 //===========================================================================
EA_Attack(int client)160 void EA_Attack(int client)
161 {
162 	bot_input_t *bi;
163 
164 	bi = &botinputs[client];
165 
166 	bi->actionflags |= ACTION_ATTACK;
167 } //end of the function EA_Attack
168 //===========================================================================
169 //
170 // Parameter:			-
171 // Returns:				-
172 // Changes Globals:		-
173 //===========================================================================
EA_Talk(int client)174 void EA_Talk(int client)
175 {
176 	bot_input_t *bi;
177 
178 	bi = &botinputs[client];
179 
180 	bi->actionflags |= ACTION_TALK;
181 } //end of the function EA_Talk
182 //===========================================================================
183 //
184 // Parameter:			-
185 // Returns:				-
186 // Changes Globals:		-
187 //===========================================================================
EA_Use(int client)188 void EA_Use(int client)
189 {
190 	bot_input_t *bi;
191 
192 	bi = &botinputs[client];
193 
194 	bi->actionflags |= ACTION_USE;
195 } //end of the function EA_Use
196 //===========================================================================
197 //
198 // Parameter:			-
199 // Returns:				-
200 // Changes Globals:		-
201 //===========================================================================
EA_Respawn(int client)202 void EA_Respawn(int client)
203 {
204 	bot_input_t *bi;
205 
206 	bi = &botinputs[client];
207 
208 	bi->actionflags |= ACTION_RESPAWN;
209 } //end of the function EA_Respawn
210 //===========================================================================
211 //
212 // Parameter:			-
213 // Returns:				-
214 // Changes Globals:		-
215 //===========================================================================
EA_Jump(int client)216 void EA_Jump(int client)
217 {
218 	bot_input_t *bi;
219 
220 	bi = &botinputs[client];
221 
222 	if (bi->actionflags & ACTION_JUMPEDLASTFRAME)
223 	{
224 		bi->actionflags &= ~ACTION_JUMP;
225 	} //end if
226 	else
227 	{
228 		bi->actionflags |= ACTION_JUMP;
229 	} //end if
230 } //end of the function EA_Jump
231 //===========================================================================
232 //
233 // Parameter:			-
234 // Returns:				-
235 // Changes Globals:		-
236 //===========================================================================
EA_DelayedJump(int client)237 void EA_DelayedJump(int client)
238 {
239 	bot_input_t *bi;
240 
241 	bi = &botinputs[client];
242 
243 	if (bi->actionflags & ACTION_JUMPEDLASTFRAME)
244 	{
245 		bi->actionflags &= ~ACTION_DELAYEDJUMP;
246 	} //end if
247 	else
248 	{
249 		bi->actionflags |= ACTION_DELAYEDJUMP;
250 	} //end if
251 } //end of the function EA_DelayedJump
252 //===========================================================================
253 //
254 // Parameter:			-
255 // Returns:				-
256 // Changes Globals:		-
257 //===========================================================================
EA_Crouch(int client)258 void EA_Crouch(int client)
259 {
260 	bot_input_t *bi;
261 
262 	bi = &botinputs[client];
263 
264 	bi->actionflags |= ACTION_CROUCH;
265 } //end of the function EA_Crouch
266 //===========================================================================
267 //
268 // Parameter:			-
269 // Returns:				-
270 // Changes Globals:		-
271 //===========================================================================
EA_Walk(int client)272 void EA_Walk(int client)
273 {
274 	bot_input_t *bi;
275 
276 	bi = &botinputs[client];
277 
278 	bi->actionflags |= ACTION_WALK;
279 } //end of the function EA_Walk
280 //===========================================================================
281 //
282 // Parameter:			-
283 // Returns:				-
284 // Changes Globals:		-
285 //===========================================================================
EA_Action(int client,int action)286 void EA_Action(int client, int action)
287 {
288 	bot_input_t *bi;
289 
290 	bi = &botinputs[client];
291 
292 	bi->actionflags |= action;
293 } //end of function EA_Action
294 //===========================================================================
295 //
296 // Parameter:			-
297 // Returns:				-
298 // Changes Globals:		-
299 //===========================================================================
EA_MoveUp(int client)300 void EA_MoveUp(int client)
301 {
302 	bot_input_t *bi;
303 
304 	bi = &botinputs[client];
305 
306 	bi->actionflags |= ACTION_MOVEUP;
307 } //end of the function EA_MoveUp
308 //===========================================================================
309 //
310 // Parameter:			-
311 // Returns:				-
312 // Changes Globals:		-
313 //===========================================================================
EA_MoveDown(int client)314 void EA_MoveDown(int client)
315 {
316 	bot_input_t *bi;
317 
318 	bi = &botinputs[client];
319 
320 	bi->actionflags |= ACTION_MOVEDOWN;
321 } //end of the function EA_MoveDown
322 //===========================================================================
323 //
324 // Parameter:			-
325 // Returns:				-
326 // Changes Globals:		-
327 //===========================================================================
EA_MoveForward(int client)328 void EA_MoveForward(int client)
329 {
330 	bot_input_t *bi;
331 
332 	bi = &botinputs[client];
333 
334 	bi->actionflags |= ACTION_MOVEFORWARD;
335 } //end of the function EA_MoveForward
336 //===========================================================================
337 //
338 // Parameter:			-
339 // Returns:				-
340 // Changes Globals:		-
341 //===========================================================================
EA_MoveBack(int client)342 void EA_MoveBack(int client)
343 {
344 	bot_input_t *bi;
345 
346 	bi = &botinputs[client];
347 
348 	bi->actionflags |= ACTION_MOVEBACK;
349 } //end of the function EA_MoveBack
350 //===========================================================================
351 //
352 // Parameter:			-
353 // Returns:				-
354 // Changes Globals:		-
355 //===========================================================================
EA_MoveLeft(int client)356 void EA_MoveLeft(int client)
357 {
358 	bot_input_t *bi;
359 
360 	bi = &botinputs[client];
361 
362 	bi->actionflags |= ACTION_MOVELEFT;
363 } //end of the function EA_MoveLeft
364 //===========================================================================
365 //
366 // Parameter:			-
367 // Returns:				-
368 // Changes Globals:		-
369 //===========================================================================
EA_MoveRight(int client)370 void EA_MoveRight(int client)
371 {
372 	bot_input_t *bi;
373 
374 	bi = &botinputs[client];
375 
376 	bi->actionflags |= ACTION_MOVERIGHT;
377 } //end of the function EA_MoveRight
378 //===========================================================================
379 //
380 // Parameter:			-
381 // Returns:				-
382 // Changes Globals:		-
383 //===========================================================================
EA_Move(int client,vec3_t dir,float speed)384 void EA_Move(int client, vec3_t dir, float speed)
385 {
386 	bot_input_t *bi;
387 
388 	bi = &botinputs[client];
389 
390 	VectorCopy(dir, bi->dir);
391 	//cap speed
392 	if (speed > MAX_USERMOVE) speed = MAX_USERMOVE;
393 	else if (speed < -MAX_USERMOVE) speed = -MAX_USERMOVE;
394 	bi->speed = speed;
395 } //end of the function EA_Move
396 //===========================================================================
397 //
398 // Parameter:			-
399 // Returns:				-
400 // Changes Globals:		-
401 //===========================================================================
EA_View(int client,vec3_t viewangles)402 void EA_View(int client, vec3_t viewangles)
403 {
404 	bot_input_t *bi;
405 
406 	bi = &botinputs[client];
407 
408 	VectorCopy(viewangles, bi->viewangles);
409 } //end of the function EA_View
410 //===========================================================================
411 //
412 // Parameter:			-
413 // Returns:				-
414 // Changes Globals:		-
415 //===========================================================================
EA_EndRegular(int client,float thinktime)416 void EA_EndRegular(int client, float thinktime)
417 {
418 /*
419 	bot_input_t *bi;
420 	int jumped = qfalse;
421 
422 	bi = &botinputs[client];
423 
424 	bi->actionflags &= ~ACTION_JUMPEDLASTFRAME;
425 
426 	bi->thinktime = thinktime;
427 	botimport.BotInput(client, bi);
428 
429 	bi->thinktime = 0;
430 	VectorClear(bi->dir);
431 	bi->speed = 0;
432 	jumped = bi->actionflags & ACTION_JUMP;
433 	bi->actionflags = 0;
434 	if (jumped) bi->actionflags |= ACTION_JUMPEDLASTFRAME;
435 */
436 } //end of the function EA_EndRegular
437 //===========================================================================
438 //
439 // Parameter:			-
440 // Returns:				-
441 // Changes Globals:		-
442 //===========================================================================
EA_GetInput(int client,float thinktime,bot_input_t * input)443 void EA_GetInput(int client, float thinktime, bot_input_t *input)
444 {
445 	bot_input_t *bi;
446 //	int jumped = qfalse;
447 
448 	bi = &botinputs[client];
449 
450 //	bi->actionflags &= ~ACTION_JUMPEDLASTFRAME;
451 
452 	bi->thinktime = thinktime;
453 	Com_Memcpy(input, bi, sizeof(bot_input_t));
454 
455 	/*
456 	bi->thinktime = 0;
457 	VectorClear(bi->dir);
458 	bi->speed = 0;
459 	jumped = bi->actionflags & ACTION_JUMP;
460 	bi->actionflags = 0;
461 	if (jumped) bi->actionflags |= ACTION_JUMPEDLASTFRAME;
462 	*/
463 } //end of the function EA_GetInput
464 //===========================================================================
465 //
466 // Parameter:			-
467 // Returns:				-
468 // Changes Globals:		-
469 //===========================================================================
EA_ResetInput(int client)470 void EA_ResetInput(int client)
471 {
472 	bot_input_t *bi;
473 	int jumped = qfalse;
474 
475 	bi = &botinputs[client];
476 	bi->actionflags &= ~ACTION_JUMPEDLASTFRAME;
477 
478 	bi->thinktime = 0;
479 	VectorClear(bi->dir);
480 	bi->speed = 0;
481 	jumped = bi->actionflags & ACTION_JUMP;
482 	bi->actionflags = 0;
483 	if (jumped) bi->actionflags |= ACTION_JUMPEDLASTFRAME;
484 } //end of the function EA_ResetInput
485 //===========================================================================
486 //
487 // Parameter:			-
488 // Returns:				-
489 // Changes Globals:		-
490 //===========================================================================
EA_Setup(void)491 int EA_Setup(void)
492 {
493 	//initialize the bot inputs
494 	botinputs = (bot_input_t *) GetClearedHunkMemory(
495 									botlibglobals.maxclients * sizeof(bot_input_t));
496 	return BLERR_NOERROR;
497 } //end of the function EA_Setup
498 //===========================================================================
499 //
500 // Parameter:			-
501 // Returns:				-
502 // Changes Globals:		-
503 //===========================================================================
EA_Shutdown(void)504 void EA_Shutdown(void)
505 {
506 	FreeMemory(botinputs);
507 	botinputs = NULL;
508 } //end of the function EA_Shutdown
509